我正处于项目中间,我正在尝试使用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的长度.我也很确定,我有足够的内存来重新分配.
我这样做了吗?我的问题在哪里?
解决方法
您对realloc行为的理解几乎是正确的.它不必返回不同的指针;可能是在初始块之后有足够的未使用内存,因此堆管理器可以将相同的指针返回给您(但调整其自身的内部状态,以便它知道块现在更大).
但是你犯了一个小错误.
stud = (student*)realloc(stud,8*sizeof(student));
在这里,您将使用realloc的返回值替换您的螺柱指针.如果由于内存不足而发生返回NULL,那么您丢失了原始螺柱指针并且内存泄漏.您应该使用临时指针.
tmp = realloc(stud,8*sizeof(student)); if (tmp) stud = tmp;
另请注意,您仍然需要在第八个插槽中放置一些东西.在realloc之后,第八个插槽是有效的已分配内存,但包含垃圾,直到您在其中存储有意义的内容.