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

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

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

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

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

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

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

由于sizeof(char)是1(根据定义),因此我们的sizeof("")sizeof(char[1]) ,它是1 * 1 = 1。

在C中, NULL是“实现定义的空指针常量”(C99§7.17.3)。 “空指针常量”被定义为值为0的整数表达式,或者这样的表达式转换为类型void * (C99§6.3.2.3.3)。 所以sizeof(NULL)的实际值是实现定义的:你可能得到sizeof(int) ,或者你可能得到sizeof(void*) 。 在64位系统上,通常有sizeof(int) == 4sizeof(void*) == 8 ,这意味着你不能依赖于sizeof(NULL)

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

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

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

“” – > Cstrings通过约定终止,带有x’00’空字符,因此字面“”由一个字符x’00’组成,并且具有1个字节的sie。

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