1

この場合、これは文字列を作成する正しい方法ですか。

Foo* create()
{
  Foo *foo = malloc(sizeof(Foo));
  foo->name = strdup("Foo");
  return foo;
}

後でfooとfoo->nameの両方を自分で削除する必要があります。

4

2 に答える 2

2

オブジェクトの割り当ては完全には正しくありません(キャストする必要がありますが、キャストしFoo*ないでくださいmystruct)。文字列の割り当ては正しいですが、希望どおりではない可能性があります。

関数はstrdup()実際にあなたを呼び出しmalloc()ます、そしてあなたが後で文字列を変更したい場合にのみこの構造が必要です(そしてその長さを増やさないでください!!!)。free()オブジェクトを破棄するときは、文字列を呼び出すことを忘れないでくださいFoo

foo->nameが読み取り専用の場合は、として宣言foo->nameし、const char *書き込みfoo->name = "Foo";を行って初期化します。

編集:また、それstrdup()が返される可能性があることに注意してNULLください、そしてあなたはそれをチェックするべきです!もしそうなら、assert()メモリ不足のエラーはかなり回復不可能なので、私はそれだけではありません。このような種類のエラーを処理しようとしないでください。Fooこれは、オブジェクトの割り当てにもカウントされます。

于 2012-08-17T14:59:56.110 に答える
0

正しいですが、のリターンポインタをキャストするmalloc必要はありません(キャストするべきではありません)。

于 2012-08-17T14:48:03.487 に答える