(char)NULL,'\ 0'和0都表示C的memset中的相同内容?

时间:2013-07-15 19:24:08

标签: linux c

我们正在将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);

5 个答案:

答案 0 :(得分:9)

do not 都意味着相同的事情,尽管它们可能会产生相同的结果。

(char)NULLNULL的值(实现定义的空指针常量)转换为charNULL的类型可以是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);