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)また、メイン関数の宣言についても言う必要があります。最後に、aは他のオブジェクト ポインターに暗黙的に変換できるため、 mallocorの結果をキャストしないでください。reallocvoid*

もう 1 つ: あなたのコーディング スタイルは、他の人にとって非常に読みにくいものです。構造体定義を次のように記述します。

typedef struct foo_
{
    int * temp;
    int   count;
} foo;

さらにもう 1 つ: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. mallocC プログラムから、またはC プログラムで戻り値をキャストする必要はありませんrealloc
  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 に答える