この場合、これは文字列を作成する正しい方法ですか。
Foo* create()
{
Foo *foo = malloc(sizeof(Foo));
foo->name = strdup("Foo");
return foo;
}
後でfooとfoo->nameの両方を自分で削除する必要があります。
この場合、これは文字列を作成する正しい方法ですか。
Foo* create()
{
Foo *foo = malloc(sizeof(Foo));
foo->name = strdup("Foo");
return foo;
}
後でfooとfoo->nameの両方を自分で削除する必要があります。
オブジェクトの割り当ては完全には正しくありません(キャストする必要がありますが、キャストし文字列の割り当ては正しいですが、希望どおりではない可能性があります。Foo*ないでくださいmystruct)。
関数はstrdup()実際にあなたを呼び出しmalloc()ます、そしてあなたが後で文字列を変更したい場合にのみこの構造が必要です(そしてその長さを増やさないでください!!!)。free()オブジェクトを破棄するときは、文字列を呼び出すことを忘れないでくださいFoo。
foo->nameが読み取り専用の場合は、として宣言foo->nameし、const char *書き込みfoo->name = "Foo";を行って初期化します。
編集:また、それstrdup()が返される可能性があることに注意してNULLください、そしてあなたはそれをチェックするべきです!もしそうなら、assert()メモリ不足のエラーはかなり回復不可能なので、私はそれだけではありません。このような種類のエラーを処理しようとしないでください。Fooこれは、オブジェクトの割り当てにもカウントされます。
正しいですが、のリターンポインタをキャストするmalloc必要はありません(キャストするべきではありません)。