我正在尝试创建一个函数,每次需要时动态地将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));
}
}
答案 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));
}
答案 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));
}
}