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

为什么C语言中执行str[0] = 0会清空整个字符串?

C语言代码运行效果解释

核心结论

你观察到的运行效果是未定义行为的其中一种表现,并不代表str[0] = 0是合法操作,换编译环境或编译参数完全可能直接触发段错误崩溃。

具体原理说明

1. C字符串的输出规则

C语言中字符串以ASCII值为0的\0作为终止标记,printf的%s格式符逻辑为:从传入的指针起始地址开始逐个读取字符输出,直到碰到第一个\0就立刻停止。
如果str[0]被成功修改为0,相当于字符串起始位置就是终止符,printf自然不会输出任何内容,这是符合字符串规则的表现。

2. 字符串字面量修改的未定义行为

C标准明确规定:字符串字面量具有静态存储期,尝试修改字符串字面量的行为属于未定义行为,标准没有约束这种操作的结果,不同编译环境的实现差异很大:

  • 大多数现代编译器默认会把字符串字面量存储在只读内存段(如.rodata段),此时任何写入操作都会直接触发段错误,这也是大众认知里"不能修改字符串字面量"的常见表现。
  • 部分老旧编译器、或者手动开启了特殊编译参数(如gcc的-fwriteable-strings)时,字符串字面量会被放到可写数据段,此时修改操作可以成功执行,就会出现你观察到的字符串被清空的效果。
  • 极端情况下还可能出现其他不可预知的结果,比如其他位置用到的同内容字符串也被修改,因为编译器可能会合并相同内容的字符串字面量存储。

正确写法建议

如果需要修改字符串内容,不要用字符指针指向字符串字面量,应该声明为可写的字符数组:

char str[] = "hello world";

这种写法是把字符串字面量的内容拷贝到栈上的可写数组中,后续修改操作完全合法,不存在兼容问题。


内容的提问来源于stack exchange,提问作者milk_beat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:01