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

