私は C 言語を勉強しています。コード セグメントについて説明が必要です。
int *p;
p = (int *) malloc(sizeof(int));
(int *) は何を意味し、上記のコードを実行すると実際に何が起こるのでしょうか?
私は C 言語を勉強しています。コード セグメントについて説明が必要です。
int *p;
p = (int *) malloc(sizeof(int));
(int *) は何を意味し、上記のコードを実行すると実際に何が起こるのでしょうか?
(int *)
いわゆるキャスト演算子です。演算子の右側の値を括弧で囲まれた型に変換するために使用されます。
ここでは、void *
によって返されるポインタを に変換するために使用されます。つまり、整数へのポインタですmalloc()
。int *
これは非常に悪い使用方法であり、使用しないでください。
malloc
これはvoid*
、何かへのポインターを意味する void へのポインターとして読み取ります。
p
typeint*
を持っているので、int へのポインタです。の結果を に代入するには、何らかの方法で にmalloc
変換するp
必要があります。int*
void*
あなたが書く場合:
int* p = malloc(...)
変換は自動的に行われます (「暗黙の変換」)。
何らかの理由で、次のように書くことにした場合:
int* p = (int*) malloc(...)
結果は同じですが、変換は明示的です (つまり、「キャスト」)。
このリンクを試してくださいman malloc
Cでは型キャストする必要がないmalloc
ので直接書く
p = malloc(sizeof(int));
参考までに、これ(int *)
は型キャストに他なりません。多くの関数が返さvoid*
れるため、ポインターを使用してさらに操作するには、それぞれの型に型キャストする必要があります。
malloc の場合、暗黙的に処理されます
(type)
C では型キャスト演算子と呼ばれます。
たとえば、
int a;
float b = 11.4;
の整数値を に入れたいとb
しa
ます。型キャストを使用する
a = (int)b
Unwind はすでに答えを出していますが、もう少し詳しく説明したいと思います。
C では、互換性のない型があります。T
type の値を typeの変数に直接代入することはできませんQ
。たとえば、int
へのポインター型の変数にポインターを代入することはできませんdouble
。
double *q;
int *p;
...
q = p; // will cause a diagnostic to be issued
ただし、本当にその割り当てを行う必要がある場合は、値をターゲットの型に変換するキャスト式を使用できます。
q = (double *) p;
p
これは、 の値をへのポインターに変換しdouble
、結果を に代入するようにコンパイラーに指示しq
ます。
元の C の K&R バージョンでは、 がmalloc
返されたため、 の結果を別の型のポインターにchar *
代入する場合は、キャストを適用する必要がありました。malloc
int *p = (int *) malloc(SIZE);
最初の C 標準が導入された 1989 年に状況が変わりました。そのバージョンvoid *
では、「ジェネリック」ポインター型として機能する型が導入されました。型の値はvoid *
、キャストを必要とせずに他のポインター型に直接割り当てることができます。したがって、C89 以降では、単純に次のように記述できます。
int *p = malloc(SIZE);
これはクリーンなだけでなく、より安全でもありました。含めるのを忘れた場合、stdlib.h
またはスコープ内の宣言がなかった場合、コンパイラは値が返されたmalloc
と想定し、それに応じてコードを生成します。値をポインター型に直接割り当てることはできないため、診断が表示されます。ただし、キャストを追加すると、その警告が抑制され、実行時に問題が発生する可能性があります。 malloc
int
int
1999 年の標準では暗黙の仮定が取り除かれたint
ため、これはもはや本当の危険ではありませんが、malloc
呼び出しのキャストをオフにしておく方がより良いスタイルです。
malloc に関するドキュメントは次のとおりです。
int のサイズのメモリ ブロックを割り当てています (この値は、システムとコンパイラの組み合わせによって異なる場合があります)。
(int *) は右側を int * としてキャストしますが、これは C では必要ありません。必要なのは malloc だけです。
int *p; // pointer to an integer
p = (int *) malloc(sizeof(int)); // assignment of enough memory for an integer
この(int *)
部分は型キャストと呼ばれ、コンパイラに次のように伝えています。
「malloc() が void * を返すことは知っていますが、それを別のものに割り当てるつもりです」.
タイプキャストには便利な理由がありますが、危険な場合もあります。この場合、malloc()
a を返すvoid *
ので、型キャストする必要はありません。これは、自動的かつ安全に他のポインター型に変換されるためです。