为什么sizeof(“”)等于1而sizeof(NULL)相当于c语言中的4?

时间:2010-11-10 06:02:28

标签: c

为什么sizeof("")相当于1而sizeof(NULL)相当于c语言中的4?

5 个答案:

答案 0 :(得分:20)

字符串文字是数组字符*(带静态存储),其中包含文字中的所有字符以及终结符。数组的大小是元素的大小乘以数组中元素的数量。

文字""是一个数组,由一个char组成,其值为0。类型为char[1]sizeof(char)始终为1;因此sizeof(char[1])始终是一个。

在C中,NULL是实现定义的,通常是((void*)0)。您的特定实现上的void*的大小为4.根据您运行的平台,它可能是不同的数字。 NULL也可能会扩展为值为0的某种类型的整数,而您将获得其大小。

*文字不是指针,数组不是指针,指针在这部分问题中不起作用。

答案 1 :(得分:12)

空字符串""的类型为char[1],或“{1}}的数组1”。正如大多数人所认为的那样,不是指针。它可以衰减成一个指针,因此每当指向char的指针时,你可以使用char的数组,而数组将衰减为一个指向它的第一个元素。

由于char为1(根据定义),因此sizeof(char)sizeof(""),即1 * 1 = 1。

在C中,sizeof(char[1])是“实现定义的空指针常量”(C99§7.17.3)。 “空指针常量”定义为值为0的整数表达式,或者此类表达式转换为类型NULL(C99§6.3.2.3.3)。因此,void *的实际值是实现定义的:您可能会获得sizeof(NULL),或者您可能获得sizeof(int)。在64位系统上,您经常有sizeof(void*)sizeof(int) == 4,这意味着您无法依赖sizeof(void*) == 8

另请注意,大多数C实现将sizeof(NULL)定义为NULL(虽然这不是标准所要求的),而大多数C ++实现只是将((void*)0)定义为普通NULL }。 这意味着0的值可以改变,具体取决于代码是编译为C还是C ++ (例如,C和C ++源文件之间共享的头文件中的代码)。所以不要依赖sizeof(NULL)

答案 2 :(得分:5)

C中的NULL定义为(void *)0。由于它是一个指针,因此需要4个字节来存储它。并且,“”是1个字节,因为“空”字符串具有EOL字符('\ 0')。

答案 3 :(得分:2)

sizeof(NULL)不是什么,而是指向地址0的指针,32位系统上的指针占用4个字节。

答案 4 :(得分:0)

“” - > Cstrings按惯例终止,带有x'00'空字符,因此字面“”由一个字符x'00'组成,并且sie为1个字节。

NULL默认情况下是一个空指针,在特定的32位机器上,在不同平台上的大小为4个字节,它可能是1,2,3,4,6或8.甚至可能是5或7但是我从未来过跨越40位或56位寻址。此外,在一些较旧的体系结构中,可能存在与指针相关联的额外位,以指示数据与指令与设备缓冲存储等。