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

