我想在结构中使用malloc一个整数指针。
如果将来我需要扩展数组,我会使用realloc。
类似的东西:
typedef struct {
int *temp,count
}foo;
main()
{
foo *fake = (foo*)malloc(1*sizeof(foo));
fake.count = 0;
++(fake.count);
fake.temp = (int*)malloc((fake.count)*sizeof(int));
/* I do something */
/*now i want to realloc "temp" to ++(fake.count) */
这样做是否正确?
++(fake.count);
fake.temp = (int*)realloc(fake.temp,(fake.count)*sizeof(int));
答案 0 :(得分:2)
原则上,是的。
但是,您应该确保您的代码在realloc
中存在可能的错误,如下所示:
int * p = realloc(fake->temp, (fake->count + 1) * sizeof(int));
if (p) { fake->temp = p; ++fake->count; }
else { /* error! But fake was untouched. */ }
此外,您应该为您的主要功能声明说int main(void)
。最后,您不应该转换malloc
或realloc
的结果,因为void*
可以隐式转换为任何其他对象指针。
还有一个:你的编码风格对其他人来说真的很难阅读。我会像这样编写结构定义:
typedef struct foo_
{
int * temp;
int count;
} foo;
还有一个:你需要动态分配fake
吗?如果不是,则自动变量foo fake;
可能更容易维护。无论如何,如果你想要动态分配它,不要强制转换,也不要重复这种类型,如下所示:
foo * fake = malloc(sizeof *fake);
// or: calloc(1, sizeof *fake); // this will zero out the memory
答案 1 :(得分:2)
malloc
或realloc
的返回值。不要直接将realloc
调用的结果分配给同一个变量。如果失败,您将泄漏原始分配。做这样的事情:
void *err = realloc(pointer, newSize);
if (err != NULL)
{
pointer = err;
}
答案 2 :(得分:0)
如果不知道realloc
是什么,那么很难说确定以I do something
的方式进行#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *temp,count;
}foo;
extern char etext, edata, end;
int main()
{
printf("Heap before first malloc %p\n", sbrk(0));
foo *fake = malloc(1*sizeof(foo));
printf("heap after first malloc %p\n", sbrk(0));
fake->count = 0;
++(fake->count);
fake->temp = malloc((fake->count)*sizeof(int));
printf("heap after second malloc %p\n", sbrk(0));
fake->count += 2;
fake->temp = realloc(fake->temp, (fake->count) * sizeof(int));
printf("count %d\n", fake->count);
printf("heap after realloc %p\n", sbrk(0));
printf("program text segment(etext) %10p\n", &etext);
printf("initialized data segment(edata) %10p\n", &edata);
printf("uninitialized data segment (end) %10p\n", &end);
return 0;
}
。但你可以从这开始......
Heap before first malloc 0x239b000
heap after first malloc 0x23bc000
heap after second malloc 0x23bc000
count 3
heap after realloc 0x23bc000
program text segment(etext) 0x400816
initialized data segment(edata) 0x600bc4
uninitialized data segment (end) 0x600bd8
这也会输出你的堆地址。
malloc()
您不需要calloc()
的演员。
考虑realloc()
清除你的记忆。在重新分配时,您可能会错误地初始化内存块。 (比如最近的免费积木)。
在使用之前,请务必检查realloc()
的返回值。失败的可能性malloc()
相当高{{1}}。