如何从函数向main函数传递二维数组?值异常问题求助
问题分析与修正方案
原代码存在的核心问题
- 局部数组生命周期失效:
arrayConstruction里的arrBuf是栈上的局部数组,函数执行结束后栈帧被销毁,内存内容变为无效。即使把myArr(指向arrBuf的指针)赋值给givenArr,main函数访问的也是已释放的内存,值必然错误。 - 指针参数按值传递:
givenArr作为函数参数是按值传递的副本,函数内修改givenArr = myArr只会改变函数内的局部指针,不会影响main函数里的emptyArr指针。 - 数组初始化越界:
int emptyArr[][2] ={0};仅初始化了1行的二维数组,但需要存储10行数据,循环访问时会触发数组越界,行为未定义。
修正方案一:提前分配数组,直接填充数据
让main函数提前分配好足够大小的数组,函数直接往该数组中写入解析后的数据(利用指针直接操作原数组内存)。
修改后的完整代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <regex.h> #include <unistd.h> #include <ctype.h> void arrayConstruction(int nb_row, char** result, int (*givenArr)[2]){ const char * separator = " \n"; // 新增换行符作为分隔符,避免解析空token char * strToken; char *outt; char *end; int i; outt = strdup(*result); strToken = strtok(outt, separator); for (i = 0; i < nb_row*2 && strToken != NULL ; i++) { // 直接写入传入的数组中 givenArr[i/2][i%2] = (int)strtol(strToken, &end, 10); strToken = strtok(NULL, separator); } free(outt); // 释放strdup分配的堆内存,避免泄漏 } int main(int argc, char **argv) { char *result = " 2 1\n\ 3 2\n\ 5 2\n\ 5 4\n\ 6 1\n\ 6 2\n\ 7 1\n\ 7 3\n\ 7 4\n\ 8 1\n\ "; int nb_rows = 10; int emptyArr[10][2] = {0}; // 提前分配10行的数组空间 arrayConstruction(nb_rows, &result, emptyArr); int i; for (i = 0; i < nb_rows; i++) { printf("%d---%d\n", emptyArr[i][0], emptyArr[i][1]); } return 0; }
修正方案二:动态分配内存,返回数组指针
如果无法提前确定数组大小,可以在函数内动态分配堆内存,返回指针给main函数使用,最后记得释放内存。
修改后的完整代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <regex.h> #include <unistd.h> #include <ctype.h> // 返回指向二维数组的指针 int (*arrayConstruction(int nb_row, char** result))[2]{ const char * separator = " \n"; char * strToken; char *outt; char *end; int i; // 动态分配nb_row行、每行2个int的数组内存 int (*myArr)[2] = malloc(sizeof(int[nb_row][2])); if (!myArr) { perror("malloc failed"); exit(EXIT_FAILURE); } outt = strdup(*result); strToken = strtok(outt, separator); for (i = 0; i < nb_row*2 && strToken != NULL ; i++) { myArr[i/2][i%2] = (int)strtol(strToken, &end, 10); strToken = strtok(NULL, separator); } free(outt); return myArr; } int main(int argc, char **argv) { char *result = " 2 1\n\ 3 2\n\ 5 2\n\ 5 4\n\ 6 1\n\ 6 2\n\ 7 1\n\ 7 3\n\ 7 4\n\ 8 1\n\ "; int nb_rows = 10; int (*emptyArr)[2] = arrayConstruction(nb_rows, &result); int i; for (i = 0; i < nb_rows; i++) { printf("%d---%d\n", emptyArr[i][0], emptyArr[i][1]); } free(emptyArr); // 释放动态分配的内存,避免泄漏 return 0; }
内容的提问来源于stack exchange,提问作者ADL92
相关产品推荐
相关产品推荐

