【问题标题】:2D array allocation function with one malloc in CC中具有一个malloc的二维数组分配函数
【发布时间】:2013-05-25 05:50:04
【问题描述】:

我需要定义分配二维数组的函数,但它应该只调用一次malloc。

我知道怎么分配它(-std=c99):

int (*p)[cols] = malloc (sizeof(*p) * rows);

但我不知道如何从函数中返回它。 Return 不是选项,因为一旦函数结束(或至少部分结束),数组将停止存在。因此,将数组传递给此函数的唯一选项是作为参数,但上述解决方案需要在声明中定义列数。有没有可能?

谢谢。

感谢用户 kotlomoy,我设法解决了这个问题:

...
#define COLS 10
#define ROWS 5

int (*Alloc2D())[COLS]
{
    int (*p)[COLS] = malloc(sizeof(*p) * ROWS);
    return p;
}

//and this is example how to use it, its not elegant,
//but i was just learning what is possible with C

int main(int argc, char **argv)
{
    int (*p)[COLS] = Alloc2D();
    for (int i = 0; i < ROWS; i++)
        for(int j = 0; j < COLS; j++)
            p[i][j] = j;

    for (int i = 0; i < ROWS; i++){
        for(int j = 0; j < COLS; j++)
            printf("%d", p[i][j]);
        printf("\n");
    }

    return 0;
}

【问题讨论】:

  • 你真的应该添加c99标签

标签: arrays function return malloc 2d


【解决方案1】:
int * Alloc2D(int rows, int cols)
{
    return malloc(sizeof(int) * rows * cols);
} 

用法。

分配:

int * array = Alloc2D( rows, cols );

获取元素[i,j]:

array[ cols * i + j ]

别忘了清理内存:

free( array );

【讨论】:

  • 从技术上讲,C 中没有二维数组......即使int array[3][4] 也不是二维数组。它是一维数组的一维数组。但是你不能动态地使用这样的数组。我给你的唯一解决方案是malloc。另一种解决方案是分配指向行的指针数组,然后在循环中分配每一行。
  • by 2d 一个可以用 [][] 索引的平均数组,我的第一行代码能够... 一维数组的一维数组 - 是的,但最终它的行为就像二维数组
  • 您的第一行甚至无法编译。它无能为力。如果你想使用 [][] 那么你必须分配指向行的指针数组,然后在循环中分配每一行。另请查看我的编辑。
  • 你需要使用 -std=c99 编译器选项
  • 嗯,微软编译器没有这样的选项。我没有使用 C99,但如果您的分配有效,那么您可能可以通过这种方式返回 int (*p)[cols] 指针:int (* Alloc2D(int rows, int cols))[cols]
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 2013-07-29
  • 2019-06-07
  • 2016-08-21
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2020-08-04
相关资源
最近更新 更多