Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存没有重新分配 我在一个项目的中间,我尝试使用 MalCube()/和 RealCube()/。我知道当我使用malloc时,它是有效的,但是当我使用realloc时,它根本不会改变分配的内存量。我一直认为realloc会重新分配您已经被malloced处理过的内存_C_Struct_Malloc_Realloc - Fatal编程技术网

内存没有重新分配 我在一个项目的中间,我尝试使用 MalCube()/和 RealCube()/。我知道当我使用malloc时,它是有效的,但是当我使用realloc时,它根本不会改变分配的内存量。我一直认为realloc会重新分配您已经被malloced处理过的内存

内存没有重新分配 我在一个项目的中间,我尝试使用 MalCube()/和 RealCube()/。我知道当我使用malloc时,它是有效的,但是当我使用realloc时,它根本不会改变分配的内存量。我一直认为realloc会重新分配您已经被malloced处理过的内存,c,struct,malloc,realloc,C,Struct,Malloc,Realloc,以下是我所拥有的: 这包括: #include <stdlib.h> 当我想使用malloc创建其中7个结构时,我将使用以下代码行: student stud* = (structure*) malloc(7*sizeof(student)); 这条线行得通。这行代码取结构的大小并乘以7。简而言之,这将占用足够的内存来创建一个包含7个结构的数组 现在,如果我想将其更改为8,我会这样做,A是以前的malloced内存,B是新的malloced(或重新分配的)内存: 以下是我如何在

以下是我所拥有的:

这包括:

#include <stdlib.h>
当我想使用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),并从给定指针中尽可能多地填充刚刚的malloced内存。当然,第二个参数必须大于先前的malloced大小,否则
stud
最终会丢失一些内存。这就是我的问题所在。当我拨打上面的电话时,它不会改变任何事情。malloced数组的长度仍然为7。我也很确定,我有足够的内存来实现


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

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

不过,你犯了一个小错误

stud = (student*)realloc(stud, 8*sizeof(student));
这里,您将用
realloc
中的返回值替换
stud
指针。如果由于内存不足而恰好返回
NULL
,则您丢失了原始
stud
指针,内存泄漏。您应该改用临时指针

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

还要注意的是,你仍然需要在第八个插槽中放入一些东西。在realloc之后,第八个插槽是有效的分配内存,但包含垃圾,直到您在其中存储有意义的内容。

这应该可以工作,尽管我有以下建议:

不要从malloc投回。它在C中是无用的,可能会隐藏您忘记包含

不要使用
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);
#包括
sometype*ptr;
...
ptr=malloc(N*sizeof*ptr);

对于N个类型的数组。

是什么让您认为malloced数组的长度仍然是7?这与您的问题无关,但我认为您的结构非常适合
枚举。
。我非常确定有足够的内存来realloc.OK,但是你还没有解释为什么你认为malloced数组的长度仍然是7,它是。为什么你不这么认为?@RobAveryIV你的评论表明你不明白答案:“我很确定有足够的内存来realloc。”告诉我你是如何计算或显示
螺柱
块的大小的。
#include <stdlib.h>
sometype *ptr;
...
ptr = malloc (N * sizeof *ptr);