0

「Foo」という名前の構造体があり、その中にポインターの2次元配列があるとしましょう

      typedef struct Foo {
          Stuff* (*stuff)[16];
      } Foo;

オブジェクト全体にメモリを割り当てるように、 initializeFoo 関数があります

      void initializeFoo(Foo **foo) {
          *foo = (Foo*)malloc(sizeof(Foo));
      }

ただし、それだけで、プログラムを実行するとセグメンテーション違反 (コア ダンプ) が発生するので、* スタッフにメモリを割り当てる必要があると考えていましたが、どうすればよいでしょうか? そして、それを initializeFoo 関数に貼り付けますか?

私の推測では、次のように使用します。

    (*foo)->stuff = (Stuff*(*)[16])malloc(sizeof(Stuff))

誰かが私を助けることができますか?

4

2 に答える 2

2

はい、にメモリを割り当てる必要がありますstuff。また、今あなたが持っているのは実は三次元の「配列」です。

また、 に十分なメモリを割り当てていませんstuff

実際には、ポインタからポインタへのポインタを使用して 2 次元配列をシミュレートする方が簡単かもしれません。

typedef struct Foo {
    Stuff **stuff;
} Foo;

次にinitializeFoo

void initializeFoo(Foo **foo)
{
    *foo = malloc(sizeof(Foo));

    /* Allocate first dimension, 32 items */
    (*foo)->stuff = malloc(sizeof(Stuff *) * 32);

    /* Allocate second dimension, 16 items each */
    for (int i = 0; i < 32; i++)
        (*foo)->stuff[i] = malloc(sizeof(Stuff) * 16);
}
于 2013-04-24T02:12:55.240 に答える
1

確実に伝えるには、すべてのコードを確認する必要がありますが、initializeFoo 自体に渡す double ポインターが割り当てられていないと推測されます。

たとえば、次のようにします。

Foo ** foo;
initializeFoo(foo);

割り当てられていない foo を逆参照するため、プログラムは segfault を起こします。ただし、次を使用する場合:

Foo * foo;
initializeFoo(&foo);

また

Foo ** foo = (Foo **)malloc(sizeof(Foo *));
initializeFoo(foo);

それでもプログラムがセグメンテーション違反を起こす場合、問題は別の場所にあるはずです。

于 2013-04-24T02:18:29.083 に答える