mallocが返すものをキャストする必要があるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1634153

  •  06-07-2019
  •  | 
  •  

質問

    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、もう意味がありません。

これは、ステートメントを作成する数少ない問題の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コマンドの使用後にキャストを強く検討する必要があります。そうしないと、互換性のないデータ型がエラーを引き起こす可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top