我们正在将32位应用程序从RHEL 5.3迁移到6.4
我们在新系统的memset
上收到一个警告“从指针转换到不同大小的整数”。(char)NULL
、'\0'
和0
在c的memset中的意思是一样的吗?
以下代码在新环境中发出警告。
#define NULLC (char)NULL
#define MAX_LEN 11
…
memset(process_name, NULLC, MAX_LEN + 1);
strncpy(process_name, "oreo", MAX_LEN);
最佳答案
虽然它们可能产生相同的结果,但并不都意味着相同的事情。(char)NULL
将实现定义的空指针常量NULL
的值转换为char
。NULL
的类型可以是int
或void*
或其他整数类型。如果它是整数类型,则转换定义良好,并产生0
。如果是void*
,则将空指针值转换为char
,它有一个实现定义的结果(很可能但不能保证为0)。
宏NULL
是指一个空指针值,而不是一个空字符,这是一个非常不同的东西。
宏NULLC
不是特别有用。如果要引用空字符,只需使用文本常量'\0'
。(而且NULLC
很容易与NULL
混淆)
另外两个常量'\0'
和0
具有完全相同的类型(int
)和值(零)。
(不可否认的是,'\0'
具有int
类型,而不是char
。这是因为历史原因,很少有关系。在C++中,字符常量属于“cc>类型,但您询问C”。