gpt4 book ai didi

c - 内存未重新分配

转载 作者:太空狗 更新时间:2023-10-29 17:16:51 24 4
gpt4 key购买 nike

我正在一个项目中尝试使用 malloc()realloc()。我知道当我 malloc 时,它会起作用,但是当我使用 realloc 时,它根本不会改变分配的内存量。我一直认为 realloc 会重新分配您已经分配的内存。

这是我的:

这包括:

#include <stdlib.h>

我有一个结构:

struct student {
int age;
int numOfClasses;
int gender; //0 male; 1 female
} student;

当我想使用 malloc 创建其中的 7 个结构时,我将使用这行代码:

student stud* = (structure*) malloc(7*sizeof(student));

这条线有效。该行代码采用结构的大小并将其乘以 7。简而言之,这将获取足够的内存来创建一个包含 7 个结构的数组。

现在,如果我想将其更改为 8,我会这样做,其中 A 是先前分配的内存,B 是新分配(或重新分配)的内存内存:

enter image description here

这是我在代码中的做法:

stud = (student*)realloc(stud, 8*sizeof(student));

据我所知,realloc 在第二个参数中获取变量并 mallocs 该内存量。然后,它获取指针(或先前的 malloced),并从给定的指针中尽可能多地填充刚刚 malloced 的内存。当然,第二个参数必须大于之前分配的大小,否则 stud 最后会丢失一些内存。现在这就是我的问题所在。当我调用上面的行时,它没有任何改变。 malloced 数组的长度仍然是 7。我也很确定我有足够的内存来重新分配。

我这样做对吗?我的问题在哪里?

最佳答案

您对realloc 行为的理解几乎是正确的。它不必返回不同的指针;可能是在初始 block 之后有足够的未使用内存,因此堆管理器可以将相同的指针返回给您(但调整它自己的内部状态,以便它知道 block 现在更大了)。

不过,你犯了一个小错误。

stud = (student*)realloc(stud, 8*sizeof(student));

在这里,您将用 realloc 的返回值替换您的 stud 指针。如果它恰好由于内存不足而返回 NULL,那么您就丢失了原来的 stud 指针并且内存泄漏了。您应该改用临时指针。

tmp = realloc(stud, 8*sizeof(student));
if (tmp)
stud = tmp;

另请注意,您仍然必须在第八个位置实际放置一些东西。在 realloc 之后,第八个插槽是有效分配的内存,但包含垃圾,直到您在其中存储有意义的内容。

关于c - 内存未重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15294586/

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