2012-04-17 15 views
1

の配列を使用することができ、私は次のコード行に出くわした:たぶん、それは動作しますはmemcmpに我々は代わりにポインタ

   memcmp(mac, (char []){0x01,0x00,0x5E}, 3) 

。上記のようにmemcmpを記述するのはいいですか?ありがとう。

+3

C99(または少なくともgcc)を使用できるとすれば問題ありません。しかし、C89コンパイラでこれを試してはいけません。 (私はそれを試していないが、私はこれがMSVCでうまくいくかどうか疑問に思う。) –

答えて

2

はいいいです。このように配列を匿名で宣言するためには、 "複合リテラル"と呼ばれます。これは、C99標準でC言語で導入された機能で、標準に準拠するすべてのコンパイラで動作します。 Visual C++のような非標準コンパイラでは動作しません。

constは、コンパイラ/リンカがスタックではなく静的なROMに配列を置きやすくするため、より正確で最適化が向上する可能性があるので、これをconst charと宣言することを検討してください。

+0

それだけではない。コンパイラは、const修飾されている場合にのみ、静的記憶期間を持つ複合リテラルを作成することが許可されています。たとえデータが一定であることが分かるとしても、複合リテラルは、非const修飾されている限り、関数の呼び出しに固有のアドレスを持つことが必要です(たとえば、再帰/再入可能の場合は問題になります)。 –

5

はい、それは動作しますが、何の問題は、それは同じです:

この文脈において
char arr[] = {0x01,0x00,0x5E}; 
memcmp(mac, arr, 3); 
0

、配列は、実際にポインタの配列・ポインタ(キーワード」から任意の点で異なっていません。減衰")。

Cではこのようにテンポラリ配列を定義できるため、この表記法を使用して、コンパイル時に既知の値の束をmac配列でテストすることができます。

関連する問題