C を使い始めたばかりで、理解できないコード行に出くわしました。誰かがそれが何をするのか説明できますか?
short int * work = (short int *) malloc(1000*16);
C を使い始めたばかりで、理解できないコード行に出くわしました。誰かがそれが何をするのか説明できますか?
short int * work = (short int *) malloc(1000*16);
何を正確に理解していないのですか?short int*
このコードは、1 つ以上の 16 ビット (少なくとも16 ビット) の符号付き整数へのポインターであるa を宣言します。によって返されるポインターに初期化します。これは、バイトmalloc
に十分な大きさのメモリのチャンクです。1000 * 16
では、なぜ彼らは を使用したの1000 * 16
でしょうか。知らない。num_elements * sizeof(element)
通常、の行に沿って割り当てますnum_elements * sizeof(short int)
。
より標準的にnum_elements * sizeof(*work)
は、ポインターの型を変更してもコードが壊れないように使用します。
mallocを使用して(動的に=実行時に)1000 * 16=16000バイトを予約しています。mallocを使用すると、予約されている16000バイトの最初のバイトのアドレスへのポインターが得られます。結果は、「work」という名前の短い整数のポインターに格納されます。通常、すべての短整数のサイズは2バイトであるため、基本的に、mallocには8000個の短整数用のスペースが予約されています(成功した場合)。
mallocがスペースの割り当てに失敗した場合、NULLを返します。
最後に、mallocが返したものをキャストすることは悪い習慣です。
タイトルに「宣言」を見ました。
彼らは、複雑な宣言のための非常に優れた Web サイトを持っています。ここ
それを分解しましょう:
short int * work
int
これは、 と呼ばれるへのポインタを宣言しますwork
。として宣言されてshort int
います。つまり、次のようにする必要があります。
int
。一般に、ショートパンツは、int
サイズが大きすぎる場合に使用されます。ウィキペディアには、C データ型の優れた内訳があります: http://en.wikipedia.org/wiki/C_data_types
= (short int *) malloc(1000*16);
これにより、1000*16 バイトが割り当てられ、ポインターに割り当てられます。詳細についてmalloc()
は、malloc()
man ページを参照してください。この特定の行は、次の理由で不適切なスタイルの例です。
short int
標準で定義されていないため、この行で特定の数の が生成されるとは限りませんshort int
。代わりに次のように書く方がよいでしょう:
short int * work = malloc(sizeof(short int) * NUMBER_OF_SHORT_INTS_REQUIRED);
または、さらに良い:
short int * work = malloc(sizeof(work[0]) * NUMBER_OF_SHORT_INTS_REQUIRED);
NULL
で何かを行う前に、必ず malloc が返されていないことを確認してくださいwork
。