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

