C语言 sizeof('\0')空终止符作为文本是四个字节,但为什么在字符串中它只占一个字节?

f87krz0w  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(189)

在c '\0'中,空终止符作为文本需要4个字节(因为它在内部只是零),但为什么它在字符数组或字符串中使用时只需要1个字节?这是一个神奇的编译器吗?
程序员在使用动态内存分配来处理空终止符大小时需要特别小心吗?下面的程序可以吗?

#include<stdio.h>
#include<stdlib.h>

int main()
{
   printf("size of null-termination: %lu\n", sizeof('\0')); //outputs 4 bytes
   printf("size of 0: %lu\n", sizeof(0)); // outputs 4 bytes

   char *message = malloc(10);
   message[0] = 'A';
   message[1] = 'B';
   message[2] = 'C';
   message[3] = '\0'; // takes 1-byte in below memory layout(attached image)

   message[4] = 'a';
   message[5] = 'b';
   message[6] = 'c';
   message[7] = '\0'; // takes 1-byte in below memory layout(attached image)

   message[8] = 'X';
   message[9] = 'Y';

   printf("\n");
   return 0;
}

sauutmhj

sauutmhj1#

在C中,与C++相反,'\0'是一个整型字符常量,类型为int
在字符串文本中,这样的转义序列存储为一个字符。
来自C标准(6.4.4.4字符常量)
10整数字符常量的类型为int。包含Map到单字节执行字符的单个字符的整数字符常量的值是被Map字符表示法的数值,被Map字符表示法解释为整数
和(6.4.5字符串文字)
6在转换阶段7,值为零的字节或代码被附加到由一个或多个字符串文字产生的每个多字节字符序列。78)然后,多字节字符序列被用于初始化静态存储持续时间和长度刚好足以包含该序列的数组。对于字符串文字,数组元素具有char类型,并且用多字节字符序列的各个字节初始化。

相关问题