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

C语言双指针二维数组传参输出异常,如何修复?

问题修复:二维数组传参导致的内存越界问题

问题原因

你当前的问题核心是指针数组的内存布局和传参、访问逻辑不匹配:

  • 用double**分配的是独立的指针数组,每一行的内存是分开申请的,并不是连续的一块内存。
  • 调用test(*XNODE)时,仅传入了第一行数组的指针;test函数里用XNODE+3*i+j的线性偏移访问,当i=1时,XNODE+3*1已经超出第一行数组的边界,访问到的是未初始化的垃圾内存(即你看到的1.63e-322),之后才碰巧读到第二行的开头数据。

修复方案1:适配指针数组的传参逻辑

修改test函数的参数类型为double**,直接用二维数组的方式访问元素,同时调用时传入完整的指针数组:

void test(double** XNODE)
{
    for(int i=0; i<2; i++){
        for(int j=0; j<3; j++){
            printf("%e ", XNODE[i][j]);
        }
        printf("\n"); // 增加换行符匹配预期输出格式
    }
}

main函数中调用方式改为:

test(XNODE);

修复方案2:分配连续内存适配线性访问

如果想保留原test函数的线性偏移访问逻辑,需要将二维数组分配为连续的一块内存,这样可以通过单指针的偏移遍历所有元素:

修改main函数的内存分配与赋值逻辑:

int main(){
    double *XNODE;
    // 分配2*3个double的连续内存块
    XNODE = (double*)calloc(2*3, sizeof(double));
    
    // 按连续内存的顺序赋值
    XNODE[0] = 1.0; XNODE[1] = -1.0; XNODE[2] = -122.0;
    XNODE[3] = 2.0; XNODE[4] = 3.0; XNODE[5] = -4.0;

    test(XNODE);
    return 0;
}

原test函数可保留,建议补充换行符:

void test(double*XNODE)
{
    for(int i=0; i<2; i++){
        for(int j=0; j<3; j++){
            printf("%e ", *(XNODE+3*i+j));
        }
        printf("\n");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:45:55