次のいずれかが正しく、100 文字を保持できる文字列を作成するためのベスト プラクティスと見なされるのはどれですか?
char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
char * charStringC = (char*)malloc(100);
char * charStringD = (char*)malloc(sizeof(char)*100);
char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
どちらも同じように正しいです。
この評価で考慮すべき重要な点は次の 2 つです。
char
、C 規格によって 1 バイトであることが保証されています。 void
ポインターに割り当てることができ、キャストは不要です。の戻り値をキャストするmalloc
ことは、次の理由から悪い習慣と見なされます。 malloc の戻り値をキャストすることの何が問題になっていますか?
上記の回答は、OPに記載されているオプションに適用されます。typesizeof
のサイズについて何も仮定せずに使用することをお勧めします。これが存在する理由と目的です。この場合、ベスト プラクティスは以下を使用することです。sizeof
char * charStringB = malloc(sizeof(*charStringB)*100);
*charStringB
と同じですが、これにより、将来タイプを変更する場合に、変更を覚えておく必要がある場所の数が少なくなるchar
という柔軟性が得られます。
最も一般的な形式は次のとおりです。
#include <stdio.h>
typedef struct { int a; char b[55]; } Thing;
Thing *p;
p = malloc (100 * sizeof *p);
これは の実際の定義とは無関係に機能するThing
ため、行を次のように「再利用」する場合
Typedef { float water; int fire; } OtherThing;
OtherThing *p;
p = malloc (100 * sizeof *p);
それでも意図したとおりに機能します。
元のケースは次のようになります。
char *p;
p = malloc (100 * sizeof *p);
、sizeof *p
もちろん不要です(sizeof(char) == 1
定義上)が、害はありません。
ところで:この答えは主にスタイルに関するものです。構文的には、stdlib.h を含める (または malloc() のプロトタイプを手動で導入する) 場合、すべてのバリアントが受け入れられます。
最初のものは、char は常に 1 バイトであるため、malloc のキャストは c++ でのみ必要です。