我们正在将32位应用程序从rhel 5.3迁移到6.4
我们在新系统的memset
上收到警告“从指针转换为不同大小的整数”。
{C}的memset中(char)NULL
,'\0'
和0
是否意味着同样的事情?
以下代码在新环境中发出警告。
#define NULLC (char)NULL
#define MAX_LEN 11
…
memset(process_name, NULLC, MAX_LEN + 1);
strncpy(process_name, "oreo", MAX_LEN);
答案 0 :(得分:9)
do not 都意味着相同的事情,尽管它们可能会产生相同的结果。
(char)NULL
将NULL
的值(实现定义的空指针常量)转换为char
。 NULL
的类型可以是int
,或void*
,或其他一些整数类型。如果它是整数类型,则转换定义良好并产生0
。如果是void*
,则将空指针值转换为char
,其具有实现定义的结果(可能但不保证为0)
宏NULL
旨在引用null 指针值,而不是null 字符,这是一个非常不同的东西。
您的宏NULLC
并不是特别有用。如果要引用空字符,只需使用文字常量'\0'
。 (而且NULLC
恕我直言,很容易与NULL
混淆。)
其他两个常量'\0'
和0
具有完全相同的类型(int
)和值(零)。
('\0'
具有类型int
而不是char
,这是违反规范的。这是出于历史原因的那种方式,并且它很少发生。在C ++中,字符常量的类型为{{ 1}},但你问过C。)
答案 1 :(得分:5)
它们都具有相同的值0
,但它们并不意味着相同的事情。
(char)NULL - You are casting the value of NULL pointer to character with value 0
'\0' - End of string character with value 0 (NUL)
0 - 32 bit integer with value 0.
您收到警告,因为您的代码中某处可能会使用以下内容:
short somevar = NULL;
或类似的东西。
答案 2 :(得分:2)
0
和'\0'
都是整数0(字符文字的类型是int
,而不是char
),因此它们完全相同。 memset的第二个参数是一个int,只使用低位8位。
NULL是一个不同的野兽。它是一种指针类型,由标准保证与任何指向真实对象的指针不同。标准 NOT 表示这是通过给它值0来完成的,尽管它必须比较等于零。此外,它可能与int
的宽度不同,因此将其作为第二个参数传递给memset()
可能无法编译。
答案 3 :(得分:0)
在定义NULLC时,您将NULL
从本机指针(64位,可能定义为(void*)0
)转换为char
(8位)。如果你想宣布NULLC,你应该做
#define NULLC 0
取消NULL
和(char)
。 memset
的正式论点是int
,而不是char
。
答案 4 :(得分:0)
0 = zero of int datatype
'\0' = (char)0 //null char
NULL = (void*)0 //null pointer
了解它们如何相互关联。 Gcc经常为编译器隐式完成的所有类型转换提供警告。
您正在使用
#define NULLC (char)NULL
.....
memset(process_name, NULLC, MAX_LEN + 1);
相当于:
memset(process_name, (char)NULL, MAX_LEN + 1);
相当于:
memset(process_name, '\0', MAX_LEN + 1);
您将char数据(即; '\0'
)作为第二个参数传递,其中“unsigned int”数据被接受。因此编译器将其转换为unsigned int implicilty,从而提供类型转换警告。您可以简单地忽略它或将其更改为:
memset(process_name, 0, MAX_LEN + 1);