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
相关产品推荐
相关产品推荐

