【问题标题】:Memory is not reallocating内存没有重新分配
【发布时间】:2013-02-24 00:46:36
【问题描述】:

我正在进行一个项目,我正在尝试使用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 是新的分配(或重新分配)的内存:

这是我在代码中的方式:

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

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

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

【问题讨论】:

  • 是什么让你认为 malloced 数组的长度仍然是 7?
  • 这与您的问题无关,但我认为您的结构非常适合 enum

标签: c struct malloc realloc


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我很确定有足够的内存来重新分配。
  • 好的,但是你还没有解释为什么你认为 malloced 数组的长度仍然是 7。
  • 。为什么你认为不是?
  • @RobAveryIV 你的评论表明你没有理解答案:“我很确定有足够的内存来重新分配。”
  • 告诉我你是如何计算或显示stud块的大小的。
【解决方案2】:

这应该可行,尽管我有以下建议:

不要从 malloc 中转换返回值。它在 C 中没用,并且可能隐藏您忘记包含 &lt;stdlib.h&gt;

不要使用ptr = realloc (ptr, ...),因为这会在 realloc 返回NULL 的情况下造成内存泄漏。相反,使用

if ((new_ptr = realloc (stud, 8 * sizeof (*stud))) != NULL) {
     stud = new_ptr;
} else {
     scream_and_die("out of memory");
}

并使用sizeof (*stud),即使用指针引用表达式,而不是指向的类型(与您分配的特定类型的指针无关) .这样,当您重命名 typedef 时,不需要修改 malloc/realloc 行。换句话说,C 中动态内存分配的最佳实践是

#include <stdlib.h>
sometype *ptr;
...
ptr = malloc (N * sizeof *ptr);

对于一个包含 N 个某些类型的数组。

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2011-09-26
    相关资源
    最近更新 更多