C语言中char*与char[]的sizeof运算结果不一致是什么原因?
问题核心误区
你的误解本质上是混淆了指针本身的内存大小和指针指向内容的内存大小,加上sizeof的编译期计算规则,才会出现不符合预期的结果:
sizeof是编译期运算符,计算结果是操作数对应类型的内存占用,和运行时变量指向的内容没有关系。- 针对
char *c = "Hello":c是指针类型变量,sizeof(c)计算的是指针本身的栈内存占用,它的大小只和运行平台的地址总线宽度有关:32位平台通常为4字节,64位平台通常为8字节,你得到的6是当前测试平台的指针宽度决定的,和它指向的"Hello"字符串完全无关。如果要获取该字符串的总长度(含空终止符),需要使用strlen(c) + 1计算。 - 针对
char ch[] = "Hello":ch是字符数组类型,初始化时会把只读数据段中的字符串字面量"Hello"(含末尾的\0终止符)完整拷贝到数组的栈内存空间,正常情况下sizeof(ch)的结果应为5 + 1 = 6字节。你得到8是因为编译器默认开启了栈内存对齐优化,为了提升内存访问效率在数组末尾填充了2字节空白,属于编译器实现层面的可选行为,关闭对齐相关编译选项后即可得到预期的6。
内容的提问来源于stack exchange,提问作者Fang Yuan
相关产品推荐
相关产品推荐

