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

C语言中传递动态数组与索引的方法及代码段错误排查解决

动态数组赋值时的段错误问题分析与解决

你遇到的段错误完全是运算符优先级在搞鬼!先看你代码里触发问题的核心行:

*arr_ptr[*int_ptr] = 1;
*arr_ptr[*int_ptr] = 2;

在C语言里,数组下标运算符[]的优先级比间接访问运算符*高得多,所以编译器会把上面的代码解析成:

*(arr_ptr[*int_ptr]) = 1;

这就完全偏离了你的本意——你本来是想先解引用arr_ptr拿到动态数组的指针,再用下标访问数组元素,但现在的写法相当于把arr_ptr当成了二维数组的指针,去访问它的第*int_ptr个元素(这是一个根本不存在的非法地址),直接触发了段错误。

解决方法

只需要给*arr_ptr加上括号,强制改变运算优先级,让编译器先解引用拿到数组指针,再进行下标访问。修改后的函数代码如下:

void fucn(int *int_ptr, int **arr_ptr) {
    (*arr_ptr)[*int_ptr] = 1;
    (*int_ptr)++;
    (*arr_ptr)[*int_ptr] = 2;
}

这样修改后,程序就能正确给动态数组的第0、1位赋值1和2,最后printf会输出12,再也不会出现段错误。

另外提一句,你注释掉的*arr_ptr = *arr_ptr + 1;是在移动数组指针,这会导致后续free(array)出错(因为free必须传入calloc返回的原始指针),所以这行注释掉是完全正确的,不用打开。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:12:36