3

私は C 言語を勉強しています。コード セグメントについて説明が必要です。

int *p;
p = (int *) malloc(sizeof(int));

(int *) は何を意味し、上記のコードを実行すると実際に何が起こるのでしょうか?

4

6 に答える 6

9

(int *)いわゆるキャスト演算子です。演算子の右側の値を括弧で囲まれた型に変換するために使用されます。

ここでは、void *によって返されるポインタを に変換するために使用されます。つまり、整数へのポインタですmalloc()int *

これは非常に悪い使用方法であり、使用しないでください

于 2012-11-28T15:50:06.637 に答える
3

mallocこれはvoid*、何かへのポインターを意味する void へのポインターとして読み取ります。

ptypeint*を持っているので、int へのポインタです。の結果を に代入するには、何らかの方法で にmalloc変換するp必要があります。int*void*

あなたが書く場合:

int* p = malloc(...)

変換は自動的に行われます (「暗黙の変換」)。

何らかの理由で、次のように書くことにした場合:

int* p = (int*) malloc(...)

結果は同じですが、変換は明示的です (つまり、「キャスト」)。

于 2012-11-28T15:51:39.227 に答える
1

このリンクを試してくださいman malloc

Cでは型キャストする必要がないmallocので直接書く

p = malloc(sizeof(int));

参考までに、これ(int *)は型キャストに他なりません。多くの関数が返さvoid* れるため、ポインターを使用してさらに操作するには、それぞれの型に型キャストする必要があります。

malloc の場合、暗黙的に処理されます

(type)C では型キャスト演算子と呼ばれます。

たとえば、

int a;
float b = 11.4;

の整数値を に入れたいとbaます。型キャストを使用する

a = (int)b

于 2012-11-28T15:50:31.133 に答える
1

Unwind はすでに答えを出していますが、もう少し詳しく説明したいと思います。

C では、互換性のない型があります。Ttype の値を 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と想定し、それに応じてコードを生成します。値をポインター型に直接割り当てることはできないため、診断が表示されます。ただし、キャストを追加すると、その警告が抑制され、実行時に問題が発生する可能性があります。 mallocintint

1999 年の標準では暗黙の仮定が取り除かれたintため、これはもはや本当の危険ではありませんが、malloc呼び出しのキャストをオフにしておく方がより良いスタイルです。

于 2012-11-28T16:40:22.230 に答える
1

malloc に関するドキュメントは次のとおりです。

int のサイズのメモリ ブロックを割り当てています (この値は、システムとコンパイラの組み合わせによって異なる場合があります)。

(int *) は右側を int * としてキャストしますが、これは C では必要ありません。必要なのは malloc だけです。

于 2012-11-28T15:53:07.060 に答える
1
int *p;  // pointer to an integer
p = (int *) malloc(sizeof(int)); // assignment of enough memory for an integer

この(int *)部分は型キャストと呼ばれ、コンパイラに次のように伝えています。

「malloc() が void * を返すことは知っていますが、それを別のものに割り当てるつもりです」.

タイプキャストには便利な理由がありますが、危険な場合もあります。この場合、malloc()a を返すvoid *ので、型キャストする必要はありません。これは、自動的かつ安全に他のポインター型に変換されるためです。

于 2012-11-28T15:58:14.703 に答える