• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体の初期化の時にポインタを入れるにはどうしたらいいですか?)

構造体の初期化の方法についての質問

このQ&Aのポイント
  • 構造体の初期化時にポインタを入れる方法について教えてください。
  • 具体的な例として、構造体の初期化時にsizeとdataを入れる方法を知りたいです。
  • dataがuint16_t*ではなくchar*の場合にも同様の方法が使えるのか知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

起動時にデータの入ったポインタを指定したいなら別に配列で用意した変数を代入するしかなさそうですが static uint16_t init_data[] = {1,2,3,4,5}; struct PACKET p = { 5, init_data };

kinoko64
質問者

お礼

なるほど、面倒くさい感じですが、 これならちゃんとできそうですね。

その他の回答 (6)

回答No.7

かな~り強引だが、これで動く。 #include <stdint.h> #include <stdio.h> #include <endian.h> #if !defined(__LITTLE_ENDIAN__) and !defined(__BIG_ENDIAN__) #if __BYTE_ORDER == __LITTLE_ENDIAN #define __LITTLE_ENDIAN__ #elif __BYTE_ORDER == __BIG_ENDIAN #define __BIG_ENDIAN__ #endif #endif struct PACKET { uint16_t size; uint16_t *data; }; #ifdef __LITTLE_ENDIAN__ struct PACKET p = {5, "\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00"}; #else struct PACKET p = {5, "\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05"}; #endif void main(void) { int i; struct PACKET *pp; pp = &p; for (i=0;i<pp->size;i++,pp->data++) printf("%d=%d\n",i,*(pp->data)); } C:\TEST\>test11 0=1 1=2 2=3 3=4 4=5 C:\TEST\> リトルエンディアン固定なら #include <stdint.h> #include <stdio.h> struct PACKET { uint16_t size; uint16_t *data; }; struct PACKET p = {5, "\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00"}; void main(void) { int i; struct PACKET *pp; pp = &p; for (i=0;i<pp->size;i++,pp->data++) printf("%d=%d\n",i,*(pp->data)); } でOK。

回答No.6

No.5 です。 できたと思ったら、「そもそも配列はポインタとイコールではないです」ということで、配列としてしか使えませんでした。

回答No.5

もしかしたら、標準じゃないのかな? 厳密には、お望みの回答じゃないですが。 struct PACKET { uint16_t size; // データの長さ uint16_t data[]; // データバイト列 }; PACKET p = {5, {1, 2, 3, 4, 5}}; PACKET q = {6, {1, 2, 3, 4, 5, 6}}; PACKET r = {7, {1, 2, 3, 4, 5, 6, 7}}; とりあえず、Borland の処理系では通りました。

kinoko64
質問者

お礼

私もこれでうまくいくような気がして書いてみたのですが、 エラーになってしまいました。。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ん, それなら #3 で言われる方法しかないです. そもそも char *str = "12345"; と「char * 型の変数を文字列リテラルで初期化する」のも, 規格上は static char aString[] = { '1', '2', '3', '4', '5', 0 }; char *str = aString; の省略形なわけだし. まあ, しいて言えば「sizeof を使えば長さを入れなくて済む」くらい.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「バイト列」で uint16_t ってのも今一つ謎だ.... さておき, (主に) data の方にどのような値を入れたいのですか?

kinoko64
質問者

補足

ごめんなさい、バイト列ではなかったですね。ワード列です。 データは" "で括るような文字列ではなく、いわゆるバイナリです。 dataが、uint16_tの配列の先頭を指すように初期化したいのですが…

  • 14557545
  • ベストアンサー率0% (0/1)
回答No.1

こんにちは キャストすれば良いと思います。 こんな感じで struct PACKET { uint16_t size; // データの長さ uint16_t *data; // データバイト列 }data = {1,(uint16_t *)"aaaa"};

kinoko64
質問者

補足

すみません、バイト列ではなかったですね。ワード列でした。 データは" "で括るような文字列ではなく、いわゆるバイナリなので、 "\x05\xa2\x35・・・・"というように文字列として書くのはかなりきついです。 リトルエンディアンとかビッグエンディアンの問題もありますし。。

関連するQ&A