首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中动态分配数组数组

在C++中动态分配数组数组
EN

Stack Overflow用户
提问于 2009-01-18 21:48:06
回答 5查看 44.6K关注 0票数 17

我并不真正理解C中的一些基本东西,比如动态分配数组的数组。我知道你能做到:

代码语言:javascript
复制
int **m;

以便声明一个二维数组(随后将使用某个*alloc函数进行分配)。此外,可以通过执行*(*(m + line) + column)“轻松”访问它。但是我应该如何给该数组中的元素赋值呢?使用gcc,下面的语句m[line][column] = 12;失败,出现分段错误。

任何文章/文档都将不胜感激。:-)

EN

回答 5

Stack Overflow用户

发布于 2009-01-18 21:53:54

您的语法mline是正确的。但是为了在C中使用二维数组,你必须为它分配内存。例如,此代码将为给定行和列的表分配内存。

代码语言:javascript
复制
int** AllocateArray(int line, int column) {
  int** pArray = (int**)malloc(line*sizeof(int*));
  for ( int i = 0; i < line; i++ ) {
    pArray[i] = (int*)malloc(column*sizeof(int));
  }
  return pArray;
}

注意,为了简洁起见,我省略了malloc的错误检查。一个真正的解决方案应该包括它们。

票数 5
EN

Stack Overflow用户

发布于 2009-01-18 21:57:55

它不是二维数组--它是一个数组的数组--因此它需要多次分配。

票数 3
EN

Stack Overflow用户

发布于 2009-01-18 23:09:47

尽管我同意其他答案,但在大多数情况下,一次分配整个数组更好,因为malloc相当慢。

代码语言:javascript
复制
int **
array_new(size_t rows, size_t cols)
{
    int **array2d, **end, **cur;
    int *array;

    cur = array2d = malloc(rows * sizeof(int *));
    if (!array2d)
        return NULL;

    array = malloc(rows * cols * sizeof(int));
    if (!array)
    {
        free(array2d);
        return NULL;
    }

    end = array2d + rows;
    while (cur != end)
    {
        *cur = array;
        array += cols;
        cur++;
    }

    return array2d;
}

要释放数组,只需执行以下操作:free(*array); free(array);

注意:只有当您不想更改行的顺序时,此解决方案才有效,因为您可能会丢失第一个元素的地址,您需要它稍后释放数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/455960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档