6

我正在进行一个项目,我正在尝试使用malloc()and 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在以前的 malloced 内存和B新 malloced(或重新分配)内存的位置执行此操作:

在此处输入图像描述

这是我在代码中的方式:

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

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

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

4

2 回答 2

11

Your understanding of realloc's behaviour is nearly correct. It doesn't have to return a different pointer; it may be that there was enough unused memory after the initial block, so the heap manager can just return the same pointer back to you (but adjust its own internal state such that it knows the block is now bigger).

You have made one small mistake, though.

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

Here you are replacing your stud pointer with the return value from realloc. If it happens to return NULL due to memory starvation, then you have lost your original stud pointer and the memory is leaked. You should use a temporary pointer instead.

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

Also note that you still have to actually put something in the eighth slot. After the realloc the eighth slot is valid allocated memory, but contains garbage until you store something meaningful in it.

于 2013-03-08T13:03:45.140 回答
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 某种类型的数组。

于 2013-03-08T13:08:30.000 回答