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

Mud*_*ain 3 c malloc c-strings sizeof null-terminated

在 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;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Vla*_*cow 6

在 C 中,与 C++ 相反的'\0'是一个整型字符常量,其类型为int

在字符串文字中,这种转义序列被存储为一个字符。

来自 C 标准(6.4.4.4 字符常量)

10 整型字符常量的类型为 int。包含映射到单字节执行字符的单个字符的整型字符常量的值是解释为整数的映射字符表示形式的数值

和(6.4.5 字符串文字)

6 在转换阶段 7 中,将值为零的字节或代码附加到由一个或多个字符串文字产生的每个多字节字符序列。78) 然后使用多字节字符序列来初始化静态存储持续时间和长度刚好足够的数组包含序列。对于字符串文字,数组元素的类型为 char,并使用多字节字符序列的各个字节进行初始化