- ベストアンサー
Cソースのコンパイルのワーニングについて
C初心者です。 お願いします。 Cソースをコンパイルしたのですが、ワーニングがでて、どうすればいいのか手も足もでません… 詳しい方ご教授ねがいます。 ワーニング内容 warning #4232-D:conversion from "DATA_T *" to a more strictly aligned type "DATA_BYTE *" may cause misaligned access sizeof(DATA_T),(DATA_BYTE *)data_t 型の定義に関してだと思うのですが、どうしていいかわかりません… キャストがうまくいってないような… 変数の定義は以下です。 typedef unsigned char DATA_BYTE_U typedef DATA_BYTE_U * DATA_BYTE typedef sutruct{ char head char dat char tail }DATA_T DATA_T *data_t OSはUNIXです。 情報が足りなければ教えてください。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
翻訳すると、 DATA_T へのポインタを(キャスト使って)DATA_BYTE へのポインタに変換しようとしてますけど、DATA_T のほうが、DATA_BYTE よりサイズが大きいから、たぶ ん、良くないことが起こりますよ。 です。 ポインタというのは、単なる「アドレス」ではなく て、ポインタ(指し示すもの)です。 ですから、「なにを」ポイントするのかも一致させる 必要があります。 また、こういうソースの通例として、おそらくは、 typedef sutruct{ char *head char *dat char *tail }DATA_T; が正解でしょう。 それぞれのメンバーをアクセスするのであれば、 data_t->head; data_t->dat; data_t->tail; でアクセス可能ですし、もしも、本当にポインタ経由で アクセスする必要があるのなら、 DATA_BYTE_U ptr = data_t->head; などで、ptr 経由でアクセスできます。 typedef unsigned char DATA_BYTE_U; typedef DATA_BYTE_U * DATA_BYTE; が正しいのなら。
その他の回答 (5)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
推測ですが、おそらく、構造体へのポインタ経由で、メンバーにアクセスしようとして、 data_t.head = ... というのがエラーになったので、 unsigned char * でキャストして、 DATA_BYTE_U data_u; 経由で、 data_u.head = とかできるのではないかと四苦八苦した気がします。 ということで、 data_t->head で問題は解決しそうな気がします。
お礼
回答ありがとうございます。 皆さんからのアドバイスを元にがんばってみたら、 とりあえず問題は解決しました。 ありがとうございました。
失礼、DATA_BYTE_U ではなく DATA_BYTE ですね。どちらにしても、不自然なキャストですから、そもそも何をやりたいのか、をはっきりさせた方がよいかと思います。
例文にセミコロンがないですね。 >キャストがうまくいってないような… (DATA_BYTE *)data_t をやったときの警告でしょうか。何のためにこのようなキャストしたのかが良く分かりません。この部分がどのように現れたのかを示さないと、的確な答えが来ないような気がします。 マシンのアーキテクチャによっては、効率を良くするために、大きめのデータの先頭番地を4バイト(アーキテクチャによって違う)の倍数の形に配置することがよくあります。しかし、DATA_BYTE_Uはunsigned char という小さいデータですから、そういうことはやらないかもしれません。ということで、マシンによってはこういうキャストをすると変なことが起こるかもしれないですよ?という警告が出たのかもしれません。 この警告を消すことを考えるよりも、そのような不自然なキャストをしないで済む方法を考えた方が良いように思われます。
- Tacosan
- ベストアンサー率23% (3656/15482)
本当は実際にコードを見ないと何とも言えないところ (と #1 でも指摘されてます) なんですが, なんとなくやりたいこととは違うコードになっているような気がします. あなたのやりたいことはなんでしょうか? ひょっとすると「実は黒魔術で何かを召喚したい」のかもしれんけど, そんな奴は自力で対処しろ.
お礼
回答ありがとうございます。 皆さんからのアドバイスを元にがんばってみたら、 とりあえず問題は解決しました。 ありがとうございました。
- asuncion
- ベストアンサー率33% (2127/6289)
その警告メッセージが出たソースの該当箇所前後の行を 見せてほしいです。 また、提示してくださった構造体定義にスペル誤りがあります。 もし、手で書き写されたのであれば、誤りを防ぐために エディタなどからコピー&ペーストしてください。 まあ、ソース全体がそれほど長くないのであれば、 いっさいがっさいをコピー&ペーストして見せていただくのが いちばん手っ取り早いです。
お礼
回答ありがとうございます。 皆さんからのアドバイスを元にがんばってみたら、 とりあえず問題は解決しました。 ありがとうございました。
お礼
ありがとうございます。 修正してみたらメッセージは消えました!! 動作は実際動かして確認してみます。。。