C - 函数返回2D数组

时间:2016-09-28 08:34:55

标签: c arrays function

也许我的问题很容易,但我在C中是新手。

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

我想返回此数组,以便在其行中执行某些操作。如何在C

中返回2D数组

有人能给我一个例子,或者我做错了什么?

此致

2 个答案:

答案 0 :(得分:1)

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

  • 静态或全局:没问题,但下次调用会覆盖内容
  • 自动:从不这样做!实际返回的是悬空指针,因为数组的生命在return语句的结尾处结束
  • dynamic(malloc-ed):很好,但是调用者必须在以后释放它。

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

答案 1 :(得分:0)

无论函数是一维还是二维,都无法返回数组。您可以返回指向数组第一个元素的指针。另外,严格来说,C中没有二维数组。最接近它的是一个包含另一个数组作为元素的数组。即像:

这样的定义
int twoDimArray[2][3];

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

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);
}