动态重新分配方阵

时间:2017-03-12 14:17:58

标签: c matrix realloc

我正在尝试创建一个函数,每次需要时动态地将1行和1列添加到方形矩阵中。我发布代码作为一个例子,我开始使用整数的“1x1矩阵”,我尝试添加一行和一列5次以获得fianl 5x5矩阵,我不明白为什么操作系统会立即停止执行。在for循环中,我首先重新分配指针的“列”数组,然后为它的每个块添加一个新的(所以新的行)(因此对于每一行)我重新分配其他N个内存块。似乎我试图访问一个禁止的内存地址,但我不明白为什么,这有什么不对? P.S:我的ennglis不可能是完美的,所以如果你不明白我想说的话我会更好地解释。

 #include <stdlib.h>
 #include <malloc.h>
 #include <stdbool.h>
 #include <stdio.h>


int **M,N;

int main(int argc, char** argv) {

 N = 1;
 M = (int**)malloc(sizeof(int*));
 M[0] = (int*)malloc(sizeof(int));

 for (int i = 0; i < 5; i++) {
     N++;
     M = (int**)realloc(M, N * sizeof(int*));
     for (int k=0; k<N; k++)
     M[k] = (int*)realloc(M[k], N * sizeof(int));
  }
}

2 个答案:

答案 0 :(得分:1)

在进入循环之前,您M指向一个int *M[0]指向一个int

在循环的第一次迭代中,您使用realloc修改M以指向2 int *的数组。第一个仍然指向单个int,但第二个仍然未初始化。当您尝试在realloc上调用M[1]时,它会读取一个未初始化的指针,调用undefined behavior。在这种情况下,它表现在崩溃中。

您需要将M新添加的元素初始化为NULL,以便realloc正常运行。

M = realloc(M, N * sizeof(int*));
M[N-1] = NULL;
for (int k=0; k<N; k++) {
    M[k] = realloc(M[k], N * sizeof(int));
}

此外,don't cast the return value of malloc/realloc

答案 1 :(得分:0)

使用realloc扩展数组时,不会初始化数组中新的扩展元素。因此,当您重新分配M时,内存的附加指针是未定义的,而不是NULL,因此您无法在第二个realloc中引用M []的扩展元素,直到将它们初始化为NULL。

 #include <stdlib.h>
 #include <malloc.h>
 #include <stdbool.h>
 #include <stdio.h>


int **M,N;

int main(int argc, char** argv) {

 N = 1;
 M = (int**)malloc(sizeof(int*));
 M[0] = (int*)malloc(sizeof(int));

 for (int i = 0; i < 5; i++) {
     N++;
     M = (int**)realloc(M, N * sizeof(int*));

      // Ensure the last M[] is NULL
     M[N-1] = NULL;

     for (int k=0; k<N; k++) 
         M[k] = (int*)realloc(M[k], N * sizeof(int));
  }
}