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

为何在for循环中打印C风格字符串数组会出现Segmentation fault,而外部打印相同元素却正常?

数组越界引发的未定义行为:为什么循环里会崩溃?

嘿,这个问题其实是C语言里很常见的数组越界访问导致的,属于典型的未定义行为——这就能解释为什么你循环外打印没问题,但一进循环就崩了。

先看你的代码问题出在哪

你定义的数组是:

char* pipe_segments[2];

这个数组只分配了2个元素的存储空间,合法的索引只有0和1。但你紧接着给pipe_segments[2]赋值了:

pipe_segments[2] = "-h";

这一步已经在写不属于这个数组的内存区域了。C语言不会帮你做数组边界检查,所以这时候程序已经处于“危险状态”,后续的表现完全是不确定的:

  • 循环外直接打印pipe_segments[2]时,可能那块越界的内存还没被其他操作修改或者覆盖,所以凑巧能正常输出;
  • 但进入for循环后,循环变量i的存储位置可能刚好和你越界写入的内存重叠,或者printf的调用触发了内存访问的校验机制,直接触发了Segmentation fault(段错误)。

怎么修复?

很简单,把数组的大小改成3,让它能容纳你要存的3个元素:

char* pipe_segments[3]; // 数组大小改为3,对应索引0、1、2
pipe_segments[0] = "ls";
pipe_segments[1] = "-l";
pipe_segments[2] = "-h";

这样所有的元素访问都在数组的合法范围内,不管是单独打印还是循环遍历,都能正常运行。

额外提醒

C语言对数组越界是“睁一只眼闭一只眼”的,不会主动报错,所以这类问题很容易被忽略。平时写代码的时候,一定要确保数组大小足够容纳所有要存储的元素,或者用动态内存分配(比如malloc/free)来灵活管理存储空间,避免踩这种坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:27:37