字符型指针变量的两种写法差异:为何输出结果不同?
两段C语言代码的核心区别及运行差异解析
1. 字符串存储与终止符的差异
第一段代码
char string[3] = "ABC"; char* pString = string; printf("%s", pString);
- 这段代码里,
char string[3]在栈上分配了3字节内存,刚好存下'A'、'B'、'C'三个字符,没有多余空间存放C字符串必需的空终止符\0。 printf("%s")的逻辑是从指针指向的地址开始输出字符,直到碰到\0才停止。因为数组里没有\0,它会越界读取后续内存中的随机数据,直到遇到某个内存位置的\0,所以输出会在ABC后附带随机ASCII字符。
第二段代码
char* pString = "ABC"; printf("%s", pString);
- 这里的
"ABC"是字符串字面量,编译器会自动在其末尾添加空终止符\0,完整存储为'A'、'B'、'C'、'\0',并将其放在程序的只读数据段中。 pString指向这个带\0的字符串首地址,printf读取到\0就停止输出,因此只会打印ABC。
2. 内存可修改性的区别
- 第一段的
string是栈上的字符数组,内容可以正常修改,比如执行string[0] = 'a';是合法操作。 - 第二段的字符串字面量属于只读数据,修改它的行为是未定义的(比如执行
pString[0] = 'a';可能导致程序崩溃或其他异常)。
内容的提问来源于stack exchange,提问作者howdoyoudo
相关产品推荐
相关产品推荐

