【问题标题】:Dynamic reallocation of a square matrix方阵的动态重新分配
【发布时间】:2017-03-12 14:17:58
【问题描述】:

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

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

【问题讨论】:

  • 您的代码中没有矩阵(又名二维数组),也没有任何东西可以指向一个。指针不是数组!如果需要矩阵,请使用二维数组。
  • @Olaf 指针不是数组并不意味着它不能像数组一样使用。 2D 数组显然行不通,因为 OP 希望能够动态重新分配
  • @EdHeal OP使用了双指针,很明显可以像二维数组/矩阵一样使用
  • @EdHeal 这与这个问题完全不相关,因为 OP 指定了一个方阵并使用单个变量 (N) 来界定两边的长度

标签: c matrix realloc


【解决方案1】:

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

在循环的第一次迭代中,您使用reallocM 修改为指向2 个int * 的数组。第一个仍然指向单个int,但第二个未初始化。然后,当您尝试在M[1] 上调用realloc 时,它会读取一个调用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

【讨论】:

    【解决方案2】:

    使用 realloc 扩展数组时,数组中新扩展的元素不会被初始化。因此,当您重新分配 M 时,指向内存的附加指针是未定义的,而不是 NULL,因此您不能在第二个重新分配中引用 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));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2015-10-14
      • 2015-11-10
      • 2021-12-19
      • 2010-11-27
      相关资源
      最近更新 更多