我正处于项目中间,我正在尝试使用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(或重新分配)内存:
以下是我在代码中的使用方法:
stud = (student*)realloc(stud, 8*sizeof(student));
据我所知,realloc在第二个参数中获取变量,mallocs获取内存量。然后,它接受指针(或之前的malloced),并尽可能多地从给定指针填充malloced内存。当然,第二个参数必须大于之前的malloced大小,否则stud
会在最后丢失一些内存。现在这就是我的问题所在。当我调用上面的行时,它不会改变任何东西。 malloced数组仍然是7的长度。我也很确定,我有足够的内存来重新分配。
我这样做了吗?问题出在哪里?
答案 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数组。