gpt4 book ai didi

c - 方阵的动态重新分配

转载 作者:行者123 更新时间:2023-11-30 14:59:25 27 4
gpt4 key购买 nike

我正在尝试创建一个函数,每次需要时都会动态地将 1 行和 1 列添加到方阵中。我发布代码作为示例,我从整数的“1x1 矩阵”开始,尝试添加行和列 5 次以获得 fianl 5x5 矩阵,我不明白为什么操作系统立即停止执行。在 for 循环中,我首先重新分配“列”指针数组,添加一个新指针(因此是一个新行),然后对于它的每个 block (因此对于每一行),我重新分配其他 N block 内存。我似乎试图访问内存的禁止地址,但我不明白为什么,出了什么问题?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));
}
}

最佳答案

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

在循环的第一次迭代中,您使用 realloc 修改 M 以指向 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

关于c - 方阵的动态重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748482/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com