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

ANSI C中for循环更新语句指针赋值问题:为何触发段错误?

错误原因分析

1. 循环终止条件逻辑错误

sizeof(vars)计算的是数组的总字节大小,而非元素个数。对于int vars[5],假设系统中int占4字节,sizeof(vars)的结果是5*4=20,这会让循环执行20次。但数组仅包含5个有效元素(索引范围0~4),当i≥5时,&vars[i]指向数组边界外的非法内存,解引用这类指针必然触发段错误。

正确的数组元素个数计算方式是sizeof(vars)/sizeof(vars[0]),通过总字节数除以单个元素的字节数,得到准确的元素数量5。

2. 指针赋值时机错误

for循环的执行流程是:初始化→条件判断→循环体→更新段。第一次循环时,var还是初始的NULL,直接执行printf("%d \n", *var)会解引用空指针,这本身就会触发段错误,根本轮不到后续的数组越界问题。

修正后的代码

int vars[5] = {0,1,2,3,4};

int* var = NULL;
// 用元素个数作为循环终止条件,调整赋值时机到循环体内
for(int i = 0; i < sizeof(vars)/sizeof(vars[0]); i++){
    var = &vars[i];
    printf("%d \n", *var);
}

更简洁的写法:

int vars[5] = {0,1,2,3,4};

for(int i = 0; i < sizeof(vars)/sizeof(vars[0]); i++){
    printf("%d \n", vars[i]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:32:04