mallocが返すものをキャストする必要があるのはなぜですか?
質問
int length = strlen(src);
char *structSpace = malloc(sizeof(String) + length + 1);
String *string = (String*) structSpace;
int *string = (int*) structSpace;
* Stringという構造体を作成しました
解決
あなたはしません。 void*
は、Cで必要なものに暗黙的にキャストします。 C FAQ も参照してください。 Cでmallocの戻り値を明示的にキャストすることを避けたい理由については、@ Sinanの答えは、これが一貫性なく守られている理由をさらに示しています。
他のヒント
mallocはvoidへのポインタを返すため、つまり、そこに格納されるデータに関係なく、単にメモリのチャンクを割り当てています。 C ++では、返されたvoid *は、型のポインターに暗黙的にキャストされません。この例では、mallocが返したものをキャストしていません。 Mallocは暗黙的にchar *にキャストされたvoid *を返しましたが、次の行で... OK、もう意味がありません。
C FAQリストは貴重なリソースです。一部のコードが返される値を慎重にキャストする理由割り当てられているポインタ型へのmalloc?。
これは、ステートメントを作成する数少ない問題の1つです。<!> quot; C ++はC <!> quotのスーパーセットです。完全に真実ではありません。 Cでは、void
ポインターを他のタイプのポインターに暗黙的にキャストできます。ただし、C ++は型安全性に関してもう少し厳密なので、malloc
の戻り値を適切な型に明示的にキャストする必要があります。通常、C ++コードはnew
ではなく<=>を使用する傾向があるため、これはあまり問題になりません。これは型キャストを必要としません。
Cでは、mallocからの結果のキャストは不要であり、実行しないでください。これを行うと、たとえば、#include <stdlib.h>
に失敗したというエラーを隠蔽できるため、スコープ内にmallocのプロトタイプがありません。これにより、他のエラーや移植性の欠如につながる可能性があります(ただし、その点で最悪の犯罪者は現在ほとんど使用されていません)。
C ++では、mallocの結果をキャストして、void以外の型へのポインターに割り当てる必要があります。ただし、CまたはC ++としてコンパイルできるコードを実際に必要にしない限り、C ++でmalloc
を使用することは一般的に避け、new
を使用してメモリを割り当てる必要があります。
初心者(またはC ++コーダー:-))からこの種のCコードを見る傾向があります:
int main() {
int len = 40;
char *my_string = (char *) malloc(sizeof(char)*len);
return 0;
}
これは不必要で悪です。stdlib.h
#include <stdlib.h>
int main() {
int len = 40;
char *my_string = malloc(sizeof(char)*len);
return 0;
}
移植性とプログラムの他の部分との互換性が向上するため、mallocコマンドの使用後にキャストを強く検討する必要があります。そうしないと、互換性のないデータ型がエラーを引き起こす可能性があります。