6

次のいずれかが正しく、100 文字を保持できる文字列を作成するためのベスト プラクティスと見なされるのはどれですか?

char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
char * charStringC = (char*)malloc(100);
char * charStringD = (char*)malloc(sizeof(char)*100);
4

3 に答える 3

13
char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);

どちらも同じように正しいです。
この評価で考慮すべき重要な点は次の 2 つです。

  1. のサイズはchar、C 規格によって 1 バイトであることが保証されています。
  2. C では、明示的なキャストなしでポインターを任意のvoidポインターに割り当てることができ、キャストは不要です。の戻り値をキャストするmallocことは、次の理由から悪い習慣と見なされます。

malloc の戻り値をキャストすることの何が問題になっていますか?


上記の回答は、OPに記載されているオプションに適用されます。typesizeofのサイズについて何も仮定せずに使用することをお勧めします。これが存在する理由と目的です。この場合、ベスト プラクティスは以下を使用することです。sizeof

char * charStringB = malloc(sizeof(*charStringB)*100);

*charStringBと同じですが、これにより、将来タイプを変更する場合に、変更を覚えておく必要がある場所の数が少なくなるcharという柔軟性が得られます。

于 2012-12-31T09:46:21.167 に答える
5

最も一般的な形式は次のとおりです。

#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() のプロトタイプを手動で導入する) 場合、すべてのバリアントが受け入れられます。

于 2012-12-31T09:52:25.083 に答える
3

最初のものは、char は常に 1 バイトであるため、malloc のキャストは c++ でのみ必要です。

于 2012-12-31T09:45:39.810 に答える