1

我想 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));
4

3 回答 3

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)你的主函数声明。最后,您不应该转换mallocor的结果realloc,因为 avoid*可以隐式转换为任何其他对象指针。

还有一个:你的编码风格真的很难让别人阅读。我会这样写结构定义:

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
于 2012-07-31T18:56:47.350 回答
2
  1. 您不需要从C 程序中mallocrealloc在 C 程序中强制转换返回值。
  2. 不要直接将realloc调用结果分配给同一个变量。如果失败,您将泄漏原始分配。改为执行以下操作:

    void *err = realloc(pointer, newSize);
    if (err != NULL)
    {
        pointer = err;
    }
    
  3. Nitpick - 乘以 1 看起来很奇怪。
于 2012-07-31T18:56:52.587 回答
0

很难说在不知道是什么的情况下这样做是否可以。但是你可以从这个开始......reallocI 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()

于 2012-07-31T19:30:12.090 回答