【问题标题】:Reallocating memory for a two dimensional array in C在 C 中为二维数组重新分配内存
【发布时间】:2017-11-02 16:04:22
【问题描述】:

我的目标是在 C 中为二维 int 数组动态重新分配内存。我知道关于该主题已经有几个问题,但不幸的是我的代码运行不正常,我不知道出了什么问题。

首先我分配内存:

int n = 10;
int m = 4;
int** twoDimArray;
twoDimArray = (int**)malloc(n * sizeof(int*));
for(int i = 0; i < n; i++) {
   twoDimArray[i] = (int*)malloc(m * sizeof(int));
}

并用整数初始化数组:

for(int i = 0; i < n; i++) {
   for(j = 0; j < 4; j++) {
      twoDimArray[i][j] = i * j;
   }
}

然后我使用realloc()动态重新分配内存:

int plus = 10;
int newArraySize = n + plus;
twoDimArray = (int**)realloc(twoDimArray, newArraySize * sizeof(int));

我希望我的 aray twoDimArray 现在可以在 [10][0] 访问,但是在运行时

printf("twoDimArray[10][0] = %d\n", twoDimArray[10][0]);

我收到“EXC_BAD_ACCESS”运行时错误。

可能我错过了一些相当简单的东西,但由于我是 C 新手,无法弄清楚我的错误。任何帮助表示赞赏。

【问题讨论】:

  • 你需要将数组从n分配到n+plus,它们是未定义的指针。
  • EXC_BAD_ACCESS 听起来像是运行时错误,而不是编译器错误。
  • 是的,对不起,我正在解决这个问题。谢谢指出!
  • 这里没有二维数组。

标签: c realloc


【解决方案1】:

重新分配指针数组是必要的,但是你只有n 值指向有效的东西。您需要分配其余的子数组,因为新分配的内存指向未分配/无效的区域。错误不是来自访问指针,而是来自取消引用它。

您需要添加如下内容:

for(int i = n; i < n+plus; i++) {
   twoDimArray[i] = malloc(m * sizeof(int));
}

(释放也一样:首先在循环中释放数组,然后释放指针数组)

旁白:

【讨论】:

  • 另外,towDimArray = realloc(twoDimArray ... ) 是潜在的内存泄漏。
  • 是的,如果它返回NULL
  • 谢谢,问题解决了!取消分配新数组时,我是否必须在新大小上创建一个 for 循环,即 for(int i = 0; i
  • 是的,您必须在 释放指针数组之前这样做。
  • 一个跟进(如果您认为为它创建一个新主题是合适的,请告诉我):如果我想以某种方式重新分配内存,则 twoDimArray 通过使用变得更小而不是更大“twoDimArray = (int**)realloc(twoDimArray, 5 * sizeof(int));”,是我得到的 twoDimArray,我可以在其中访问“twoDimArray[0][j]”,直到“twoDimArray[4][j ]", j in {0, 1, 2, 3} ?因为当我这样做时,我仍然可以访问“twoDimArray[9][j]”,即使我认为它正在被 realloc() 释放?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2012-02-05
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多