Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 方阵的动态再分配_C_Matrix_Realloc - Fatal编程技术网

C 方阵的动态再分配

C 方阵的动态再分配,c,matrix,realloc,C,Matrix,Realloc,我正在尝试创建一个函数,每当我需要时,它都会动态地将一行和一列添加到一个方形矩阵中。我以代码为例,从一个1x1的整数矩阵开始,我试着添加一行和一列5次,以获得一个fianl 5x5矩阵,我不明白为什么操作系统会立即停止执行。在for循环中,首先我重新分配指针的列数组,添加一个新行,然后为它的每个块重新分配其他N个内存块。似乎我试图访问一个被禁止的内存地址,但我不明白为什么,怎么了? 附言:我的英式英语不可能完美,所以如果你不明白我想说什么,我会更好地解释 #include <stdlib

我正在尝试创建一个函数,每当我需要时,它都会动态地将一行和一列添加到一个方形矩阵中。我以代码为例,从一个1x1的整数矩阵开始,我试着添加一行和一列5次,以获得一个fianl 5x5矩阵,我不明白为什么操作系统会立即停止执行。在for循环中,首先我重新分配指针的列数组,添加一个新行,然后为它的每个块重新分配其他N个内存块。似乎我试图访问一个被禁止的内存地址,但我不明白为什么,怎么了? 附言:我的英式英语不可能完美,所以如果你不明白我想说什么,我会更好地解释

 #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));
  }
}

在进入循环之前,M指向一个整数*并且M[0]指向一个整数

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

您需要将新添加的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));
}

另外,

使用realloc展开数组时,数组中新展开的元素不会初始化。因此,当您使用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));
  }
}

您的代码中没有矩阵,也没有可以指向矩阵的数组。指针不是数组!如果需要矩阵,请使用2D数组。@Olaf指针不是数组并不意味着它不能像数组一样使用。二维阵列显然无法工作,因为OP希望能够动态地reallocate@EdHealOP使用了双指针,很明显,它可以像2D阵列一样使用/matrix@EdHeal但这与这个问题无关,因为OP指定了一个平方矩阵,并使用一个变量N来限定两边的长度