【问题标题】:C - Function return 2D array [duplicate]C - 函数返回二维数组[重复]
【发布时间】:2017-02-06 02:45:33
【问题描述】:

也许我的问题很简单,但我是 C 的新手。

我创建了一个函数,它从文件中读取一些数据,然后将它们传递给另一个函数,该函数根据给定的行数和列数解析它们并创建一个二维数组。

我想返回这个数组以便在它的行中执行一些操作。如何在 C 中返回二维数组

谁能给我一个例子或者我做错了什么?

问候

【问题讨论】:

  • @M.SCaudhari 谢谢。我在问之前读过它,但仍然很困惑!有什么帮助吗?
  • stackoverflow.com/a/14088911/3684343 不正是您想要的答案吗?如果您不向我们展示您的代码,我们也不能说您做错了什么。

标签: c arrays function


【解决方案1】:

无论是一维还是二维,您都不能将数组作为函数的结果返回。您可以返回指向数组第一个元素的指针。此外,严格来说,C 中没有二维数组。与此最接近的是包含另一个数组作为元素的数组。 IE。像这样的定义:

int twoDimArray[2][3];

如果此类数组的维度是动态确定的,则不能在文件范围内定义它。您只能使用某些功能在本地定义它。这样的数组将是一个局部变量,将存储在系统堆栈中,并在控制离开函数时消失。就个人而言,我会使用这样的模式。 IE。像这样的代码:

int main() {
    int rows, cols;
    ...
    getDimensions(&rows, &cols);
    // definition with dynamic dimensions in function scope is O.K.
    int a[rows][cols];
    init(rows, cols, a);
    proceed(rows, cols, a);
    ...
}

init 函数可以这样定义:

void init(int rows, int cols, int a[rows][cols]) {
    int i,j;
    for(i=0; i<rows; i++) {
        for(j=0; j<cols; j++) {
            a[i][j] = i*100+j;
        }
    }
}

如果不能使用这样的模式(例如数组太大而您的系统堆栈太小),我会使用:

int main() {
    int rows, cols;
    getDimensions(&rows, &cols);
    int (*a)[cols] = malloc(sizeof(int [rows][cols]));
    init(rows, cols, a);
    proceed(rows, cols, a);
    free(a);
}

如果你坚持要返回这样一个数组的函数,我会使用 void 指针:

void *allocate2DintArray(int rows, int cols) {
    return(malloc(sizeof(int [rows][cols])));
}

void *allocateAndInit(int rows, int cols) {
    int i,j;
    int (*a)[cols] = allocate2DintArray(rows, cols);
    for(i=0; i<rows; i++) {
        for(j=0; j<cols; j++) {
            a[i][j] = i*100+j;
        }
    }
    return(&a[0][0]);
}

int main() {
    int rows, cols;
    ...
    getDimensions(&rows, &cols);
    int (*a)[cols] = allocateAndInit(rows, cols);
    proceed(rows, cols, a);
    ...
    free(a);
}

【讨论】:

    【解决方案2】:

    注意,在 C 中返回数组是初学者的陷阱,因为它高度依赖于存储持续时间:

    • 静态或全局:没问题,但内容将被下次调用覆盖
    • 自动:永远不要那样做!实际上返回的是一个悬空指针,因为数组的生命在返回语句的末尾结束
    • 动态(malloc-ed):很好,但调用者必须稍后释放它。

    更惯用的方式是调用者传递它拥有的数组及其大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-03
      • 2021-08-11
      • 2013-07-04
      • 2021-03-29
      • 1970-01-01
      • 2021-05-01
      • 2021-12-04
      相关资源
      最近更新 更多