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

数组的数组赋值异常问题求助:代码执行错误如何解决?

数组的数组赋值异常问题求助:代码执行错误如何解决?

嘿,我来帮你拆解一下代码里的问题,其实核心是指针的优先级和多级指针访问数组的方式搞混了,咱们一步步来分析:

问题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个元素,有两种等价的写法:

  1. 用数组下标:(*A)[i] = i(先取*A得到数组首地址,再用下标访问第i个元素)
  2. 用指针偏移:*( (*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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 15:24:09