在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;
}

enter image description here

推荐答案

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

在字符串文字中,这样的转义序列存储为一个字符.

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

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

AND(6.4.5字符串文字)

6在翻译阶段7中,将值为零的字节或代码附加到 由字符串文字生成的每个多字节字符序列 78)然后使用多字节字符序列来 初始化静态存储持续时间和长度数组 足以包含该序列.For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence.

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

VS代码C/C++扩展intellisense无法检测环境特定函数'

Tiva TM4C123GXL的I2C通信

创建一个fork导致fget无限地重新读取文件

二进制计算器与gmp

如何在ASM中访问C struct 成员

如何在C语言中正确打印图形

X64:并发写入布尔数组

在编写代码时,Clion比vscode有更多的问题指示器

将数组插入数组

如何在VSCode中创建和使用我自己的C库?

C标准关于外部常量的说明

无法识别C编程语言的语法,如书中所示

生产者消费者计数器意外输出的C代码

在C中使用无符号整数模拟有符号整数

为什么会出现此错误?二进制表达式的操作数无效

分配给静态变量和动态变量的位置之间有区别吗?

System V 消息队列由于某种原因定期重置

在C中定义函数指针?

如何使用 raylib 显示数组中的图像