代码之家  ›  专栏  ›  技术社区  ›  sam32

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

  •  1
  • sam32  · 技术社区  · 12 年前

    我想要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 回复  |  直到 12 年前
        1
  •  2
  •   Kerrek SB    12 年前

    原则上是的。

    但是,您应该确保您的代码在 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 重新分配 ,由于 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
    
        2
  •  2
  •   Carl Norum    12 年前
    1. 您不需要从中强制转换返回值 malloc realloc 在C程序中。
    2. 不要直接指定 重新分配 调用相同的变量。如果失败,您将泄露原始分配。改为执行以下操作:

      void *err = realloc(pointer, newSize);
      if (err != NULL)
      {
          pointer = err;
      }
      
    3. 尼特皮克-乘以1看起来很奇怪。
        3
  •  0
  •   Aftnix    12 年前

    很难说是否会 好啊 去做 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
    
    1. 你不需要石膏 malloc()

    2. 考虑 calloc() 清除你的记忆。当您重新分配时,您可能会得到错误初始化的内存块。(比如最近免费的区块)。

    3. 始终检查的返回值 realloc() 在使用之前。失败的可能性 realloc() 那就相当高了 malloc()