为什么sizeof("")
相当于1而sizeof(NULL)
相当于c语言中的4?
答案 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位寻址。此外,在一些较旧的体系结构中,可能存在与指针相关联的额外位,以指示数据与指令与设备缓冲存储等。