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

如何从函数向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:20:40