You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符型指针变量的两种写法差异:为何输出结果不同?

两段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:42:07