Jos*_*osh 5 c malloc struct realloc
我正在尝试向我的结构添加10个元素,这个元素已经是malloc,其大小为20,这就是我定义结构的方式:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct st_temp {
char *prod;
};
int main ()
{
struct st_temp **temp_struct;
size_t j;
temp_struct = malloc (sizeof *temp_struct * 20);
for (j = 0; j < 20; j++) {
temp_struct[j] = malloc (sizeof *temp_struct[j]);
temp_struct[j]->prod = "foo";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我想到的是重新分配(但是,不知道如何):
temp_struct = (struct st_temp **) realloc (st_temp, 10 * sizeof(struct st_temp*));
Run Code Online (Sandbox Code Playgroud)
然后添加额外的10个元素,
for (j = 0; j < 10; j++)
temp_struct[j]->prod = "some extra values";
Run Code Online (Sandbox Code Playgroud)
我怎么能实现这个目标?任何帮助表示赞赏!
使用时realloc(),必须提供新大小而不是要添加的字节数.所以:
temp_struct = (struct st_temp **) realloc (temp_struct, 30 * sizeof(struct st_temp*));
Run Code Online (Sandbox Code Playgroud)
30当然是你原来的20加10多.realloc()如果需要移动内存块,该函数负责将原始数据复制到新位置.
然后,添加额外的10个元素就像是(从索引20开始,而不是0):
for (j = 20; j < 30; j++) {
temp_struct[j]->prod = "some extra values";
}
Run Code Online (Sandbox Code Playgroud)
为了避免内存泄漏,我们需要小心处理重新分配(稍后会详细介绍).realloc函数:
void *realloc(void *ptr, size_t size),哪里
ptr=指向原始(malloc'ed)内存块的指针,和
size =内存块的新大小(以字节为单位).
realloc返回动态分配的内存块的新位置(可能已更改) - 如果重新分配失败,则返回NULL!如果它返回NULL,则原始内存保持不变,因此必须始终使用临时变量作为返回值realloc.
一个例子将澄清一点(兴趣点:realloc语法类似于malloc的(不需要额外的强制转换等),并且在realloc之后,你需要像在malloc之后那样为新对象生成相同的步骤):
struct st_temp **temp_struct;
temp_struct = malloc(20 * sizeof *temp_struct);
if (temp_struct == NULL) { /* handle failed malloc */ }
for (int i = 0; i < 20; ++i) {
temp_struct[i] = malloc(sizeof *temp_struct[i]);
temp_struct[i]->prod = "foo";
}
// We need more space ... remember to use a temporary variable
struct st_temp **tmp;
tmp = realloc(temp_struct, 30 * sizeof *temp_struct);
if (tmp == NULL) {
// handle failed realloc, temp_struct is unchanged
} else {
// everything went ok, update the original pointer (temp_struct)
temp_struct = tmp;
}
for (int i = 20; i < 30; ++i) { // notice the indexing, [20..30)
// NOTICE: the realloc allocated more space for pointers
// we still need to allocate space for each new object
temp_struct[i] = malloc(sizeof *temp_struct[i]);
temp_struct[i]->prod = "bar";
}
// temp_struct now "holds" 30 temp_struct objects
// ...
// and always do remember, in the end
for (int i = 0; i < 30; ++i)
free(temp_struct[i]);
free(temp_struct);
Run Code Online (Sandbox Code Playgroud)
请注意,这不是一个结构数组,而是一个指向结构的指针数组 - 如果你愿意的话,甚至是结构数组的数组.在最后一种情况下,每个子数组的长度为1(因为我们只为一个结构分配空间).