realloc int指针存在于结构中[C]

时间:2012-07-31 18:52:49

标签: c structure realloc

我想在结构中使用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));

3 个答案:

答案 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)。最后,您不应该转换mallocrealloc的结果,因为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)

  1. 您无需在C程序中转换mallocrealloc的返回值。
  2. 不要直接将realloc调用的结果分配给同一个变量。如果失败,您将泄漏原始分配。做这样的事情:

    void *err = realloc(pointer, newSize);
    if (err != NULL)
    {
        pointer = err;
    }
    
  3. Nitpick - 乘以1看起来很奇怪。

答案 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()
  1. 您不需要calloc()的演员。

  2. 考虑realloc()清除你的记忆。在重新分配时,您可能会错误地初始化内存块。 (比如最近的免费积木)。

  3. 在使用之前,请务必检查realloc()的返回值。失败的可能性malloc()相当高{{1}}。