内存不会重新分配

前端之家收集整理的这篇文章主要介绍了内存不会重新分配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正处于项目中间,我正在尝试使用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之后,第八个插槽是有效的已分配内存,但包含垃圾,直到您在其中存储有意义的内容.

原文链接:https://www.f2er.com/c/117585.html

猜你在找的C&C++相关文章