数组的数组赋值异常问题求助:代码执行错误如何解决?
数组的数组赋值异常问题求助:代码执行错误如何解决?
嘿,我来帮你拆解一下代码里的问题,其实核心是指针的优先级和多级指针访问数组的方式搞混了,咱们一步步来分析:
问题1:为什么**A=i只会给第一个元素赋值?
你写的**A=i等价于(*A)[0] = i——因为*A是你malloc出来的一维数组的首地址,**A就是这个数组的第一个元素。所以循环里每次循环都在给同一个位置赋值,最后第一个元素被覆盖成4(循环最后一次i=4),而数组其他位置还是malloc分配内存时的初始值(这里看起来是0),所以输出就是4 0 0 0 0。
问题2:为什么*A[i]=i会触发崩溃?
这是C语言运算符优先级的坑![]的优先级比*高,所以*A[i]会被解释成*(A[i])。而你的A是int**类型,它只指向了main里的k这一个指针变量。当i>=1时,A[i]就是访问A指针偏移i个int*大小的内存位置,这属于越界访问非法内存,自然会触发illegal instruction崩溃。
正确的写法
要给malloc出来的数组的第i个元素赋值,你需要先拿到数组的首地址*A,再访问它的第i个元素,有两种等价的写法:
- 用数组下标:
(*A)[i] = i(先取*A得到数组首地址,再用下标访问第i个元素) - 用指针偏移:
*( (*A) + i ) = i(和上面的写法逻辑完全一致,只是用指针算术实现)
修正后的完整代码
#include <stdio.h> #include <stdlib.h> void func(int **A){ int i; *A=(int *)malloc(5*sizeof(int)); for (i=0;i<5;i++){ (*A)[i] = i; // 这里是修正后的赋值语句 } } int main(){ int *k, i; func(&k); for (i=0;i<5;i++){ printf("%d ", k[i]); } free(k); // 别忘了释放malloc的内存,避免内存泄漏 return 0; }
这里我还加了free(k),因为malloc分配的内存需要手动释放,不然会造成内存泄漏哦~
额外提醒
处理多级指针的时候,一定要注意运算符的优先级,不确定的时候就加括号明确执行顺序,这样能避免很多莫名其妙的bug!
备注:内容来源于stack exchange,提问作者Giorgos
相关产品推荐
相关产品推荐

