内存不会重新分配

时间:2013-03-08 13:00:11

标签: c struct malloc realloc

我正处于项目中间,我正在尝试使用malloc()realloc()。我知道当我使用malloc时,它可以工作,但是当我使用realloc时,它根本不会改变分配的内存量。我总是认为realloc会重新分配你已经存在的malloced内存。

这就是我所拥有的:

这包括:

#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是之前的malloced内存,B是新的malloced(或重新分配)内存:

enter image description here

以下是我在代码中的使用方法:

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

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

我这样做了吗?问题出在哪里?

2 个答案:

答案 0 :(得分:11)

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

但是你犯了一个小错误。

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

在这里,您要使用stud的返回值替换realloc指针。如果由于内存不足而发生返回NULL,那么您丢失了原始stud指针并且内存泄漏。你应该使用临时指针。

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

另请注意,您仍然需要在第八个插槽中放置一些内容。在重新分配之后,第八个插槽是有效的已分配内存,但包含垃圾,直到您在其中存储有意义的内容。

答案 1 :(得分:4)

这应该有用,虽然我有这些建议:

不要从malloc转换回报。它在C中无用,可能隐藏您忘记包含<stdlib.h>

不要使用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个sometypes数组。