memcpy
メモリを割り当てません。呼び出しでは、変数が定義されたときにmemcpy
宛先のメモリarr
が割り当てられました( )。arr
char arr[400]
十分なスペースを割り当てていないという問題があります。sizeof(updata)
バイトをにコピーすると、おそらく 1+4+7*256=1797 になります (これは、プラットフォームで未使用のバイトを実際にすべて除外するかどうかarr
によって異なります)。本当に必要な場合(おそらく必要ない場合)、少なくとも大きくしてください。で定義しても問題ありません。sizeof(int)
__packed__
arr
sizeof(updata)
char arr[sizeof(updata)]
構造体のレイアウトが何らかの外部フォーマットで定義されている場合は、代わりに固定サイズの型を使用する必要がありますint
(プラットフォームに応じて 2 または 4 バイトであり、他のサイズになる可能性がありますが、それらに遭遇する可能性はほとんどありません)。
構造体のレイアウトが何らかの外部バイナリ形式で定義されていて、この形式で 1797 バイトを出力したい場合は、fwrite
.
fwrite(updata, sizeof(updata), 1, stdout);
データの人間の表現が必要な場合はprintf
、適切な形式仕様で使用してください。
printf("ip='%c' udp=%d\n", updata.ip, updata.ip);
for (i = 0; i < sizeof(updata.rules)/sizeof(updata.rules[0]); i++) {
puts(updata.rules[i].myname);
}
名前にもかかわらず、char
実際にはバイトの種類です。C には文字の個別の型はありません。文字定数 like'a'
は、実際には整数値です (ほぼすべてのシステムでASCIIに従って 97 です)。で書いたり、バイトを文字として解釈しputchar
たりするようなものです。printf("%c", …)
一方、ポインタ( などchar*
) と整数を混同してもコンパイラがエラーを通知しない場合は、警告レベルを上げます。Gcc では、少なくともgcc -O -Wall
.
コードを実際にコンパイルした後、主なエラーが表示されます (質問のコンパイラからのエラー メッセージをコピーして貼り付ける必要があります)。
udpdata.rules[0].myname = "lalla\0" ;
udpdata.rules[0].myname
バイト配列です。C では配列に代入できません。要素を 1 つずつコピーする必要があります。これは の配列でありchar
、それに文字列をコピーしたいので、 を使用strcpy
して文字列のすべてのバイトをコピーできます。一般に、一連のバイトの場合は、memcpy
.
strcpy(udpdata.rules[0].myname, "lalla");
("lalla\0"
は と同等であり"lalla"
、C ではすべての文字列リテラルがゼロで終了することに注意してください。¹)strcpy
はサイズの検証を実行しないため、割り当てたメモリに文字列 (最後の null 文字を含む) が収まるようにする必要があります。ターゲットのために。最大サイズを指定する場合は、strncat
またはなどの他の関数を使用できます。strlcpy
¹ゼロで終了しない1 つの例外 (およびこの例外のみ) があります。"lalla"
たとえば、5 バイトの配列を初期化するときchar bytes[5] = "lalla"
です。配列サイズが少なくとも 6 であるか指定されていない場合、終端のゼロ バイトがあります。