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

C语言int**型二维动态数组求和函数错误排查求助

修复int**类型二维数组的求和函数错误

你的求和函数结果不正确的核心原因是:int**类型的二维数组并非连续的内存块。

你在代码里用int* p = &(**arr);拿到第一个元素的地址后,试图通过p + i*m + j的方式索引元素——这种写法只适用于连续分配的二维数组(比如栈上的int arr[n][m],或者用单块malloc分配的连续内存)。但你的主函数中,每个子数组都是单独调用malloc分配的,arr[i]指向的是彼此独立的堆内存块,它们的地址并不连续,直接用一维指针偏移会访问到无效内存,导致结果错误。

正确的求和函数实现

直接通过双重循环遍历每个子数组的元素即可,适配你当前的内存分配方式:

int two_d_sum(int ** arr, int n, int m) {
    int sum = 0;
    
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j){
            sum += arr[i][j];
        }
    }
    return sum;
}

如果偏好指针风格的写法,逻辑和上面完全等价:

int two_d_sum(int ** arr, int n, int m) {
    int sum = 0;
    
    for(int i = 0; i < n; ++i){
        int *current_row = arr[i];
        for(int j = 0; j < m; ++j){
            sum += *(current_row + j);
        }
    }
    return sum;
}

可选:让原写法生效的内存分配方式

如果你坚持想用一维指针偏移的方式求和,需要把二维数组改成连续内存分配,主函数的内存分配代码要改成这样:

printf("Enter the number of arrays in the array (n): ");
int size_n;
scanf("%d%*c", &size_n);

printf("Enter the number of elements in the array in the array (m):");
int size_m;
scanf("%d%*c", &size_m);

// 先分配一块能存下所有元素的连续内存
int *data = (int *)malloc(size_n * size_m * sizeof(int));
// 再分配指针数组,让每个指针指向对应行的起始位置
int **arr = (int **)malloc(size_n * sizeof(int *));
for (int i = 0; i < size_n; i++) {
    arr[i] = data + i * size_m;
    for (int j = 0; j < size_m; j++) {
        int num;
        printf("Enter a number: ");
        scanf("%d%*c", &num);
        arr[i][j] = num;
    }
}

// 释放内存时要注意顺序:先释放data,再释放arr
// ...

这种情况下,你的原求和函数就能正确工作,但显然第一种直接遍历子数组的写法更适配你最初的代码逻辑,也更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:58:28