私はこのようなことをしようとしています:
struct SomeStruct {
const char *bytes;
const char *desc;
};
SomeStruct example = { { 0x10, 0x11, 0x12, 0x13 }, "10-13" };
なぜこれが機能しないのですか?
おそらく、はへのポインタではなく、{ 0x10, 0x11, 0x12, 0x13 }
の配列であるためです。char
char
SomeStruct example = { "\x10\x11\x12\x13", "10-13" };
代わりに試してください。
{ ... }
構文は配列の割り当てにのみ適しているため、は配列でconst char*
はなくポインターです。
bytes
代わりに配列として宣言するとchar bytes[4];
、代入が機能します。
コンパイラは{1, 2, 3, 4}
バイトへのポインターに変換できないためです (「10-13」を char へのポインターに変換できます)。
「文字列」形式でバイトを指定できます (が指すメモリに余分な 0x00 が含まれていてもかまわない場合bytes
):
SomeStruct example = {"\x10\x11\x12\x13", "10-13"};
他の人が言ったように、初期化シーケンスは配列に対して有効であり、構造体にはポインターが含まれています。文字列リテラルを使用してマラギダの応答を使用できますが、IMHO、これは最も読みやすいものではありません (たとえば、明示的な定数をマニフェスト定数に置き換えることにした場合は機能しません)。より一般的な解決策は、別の名前付き配列を定義して使用することです。
char const structBytes10to13[] = { 0x10, 0x11, 0x12, 0x13 };
SomeStruct example = { structBytes10to13, "10-13" };
これは、文字配列内の任意の初期化式に対して機能します。