ここから本文です

ポインタと構造体について質問です。

ojt********さん

2013/6/121:20:42

ポインタと構造体について質問です。

typedef struct
{
unsigned char a;
unsigned char b;
char c[4];
}ABC;

typedef struct
{
unsigned char a;
unsigned char b;
ABC c;
}EDO;


このような2つの構造体があったときに、

unsigned char b[8];
EDO *test1;
ABC *test2;

strcpy(b,"12345678");
test1 = (EDO *)b;
test2 = &test1->c;

とすることで、test2のABCの中にbで定義した345678という文字が1バイトずつ入ると思うのですが(表現が違うかもですが)、

test2->a = test1->c.a
というような、メンバを直接操作するにはどのようにしたらよいのでしょうか。
あと、なぜこの書き方ではエラーがでてしまうのでしょうか。

やりたいこととしては、test2のメンバに自由に値をいれたいです。
今は、上記のやり方で構造体のアドレスを渡して全体としての形でしか値のやり取りがわかりません。

よろしくお願いします。

補足-補足-
後学のために教えていただきたいのですが、
memcpy((void*)(&test2),(void*)(test1->c),sizeof(EDO));
が何をしているのか教えていただけますか?

memcpyでtest2にtest1->c の内容をEDOのサイズだけ入れるで良いでしょうか?
正直(void *)とすぐ後に&が書いてある意味がわかりません。。
また、test2よりtest1のほうがでかいと思うので、sizeofの書き方に違和感があります
考え方に間違いがありましたら、ご教授お願いします

閲覧数:
355
回答数:
4
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

編集あり2013/6/122:47:04

> エラーがでてしまう
どういうエラーが出たか、というのはトラブルシュートで「非常に」重要な情報です。質問の際には「必ず」エラーの内容を略さずに書いていただきたいものです。

質問のプログラム片では、まず単純ミスでしょうがやってはならないレベルなのが
strcpy(b,"12345678");
です。文字列には終端文字が付きますから、"1234567"ぐらいにしておかないと。
つぎに、test2は宣言だけされた「どこを指しているかわからないポインタ」です。大抵はメチャクチャな場所を指しているので、そこにアクセスしようとするとOSによって叱られて非常停止します。多分それが「エラー」になっているところじゃないかと思いますが。
もう一点、EDOはサイズ8byteになる保証はあるかなぁ...コンパイラによっては、cはワード境界揃えられちゃうこともあるかも知れませんよ。とすると、
test1 = (EDO *)b;
はちょっと危険かも。まぁ、とりあえずVisual C++とcygwinのgcc, Borland C++では御期待の動きをしましたけれど。以下はそれらのコンパイラの前提で...

int main(void){

unsigned char b[8];
EDO *test1;
ABC body_ABC;
ABC *test2=&body_ABC;

strcpy(b,"1234567");
test1 = (EDO *)b;
test2 = &test1->c;
test2->a = test1->c.a;
printf("%c\n",test2->a);
return 0;
}
では'3'が表示されました。


> バカは他人を指導したがる。
mainをつけて書く、とか本を買う、とかアンケートをしない、とか学ぶ、とかきょろきょろしない、とか。

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

rar********さん

編集あり2013/6/122:01:48

まず、test2 の実体がありませんね。
unsigned char b[9]; //文字列最後のnullを含むため8+1
ABC *test2;
ではポインタ宣言をしただけになってしまいます。

EDO *test1;
ABC test2;

strcpy(b,"12345678);
test1=(EDO*)b;
memcpy((void*)(&test2),(void*)(test1->c),sizeof(EDO));

不適切な内容が含まれている可能性があるため、非表示になっています。

投稿内容に関する注意

u_h********さん

2013/6/121:56:56

下の方、答えられないのに無駄に書き込んでるやつがいるな。

不適切な内容が含まれている可能性があるため、非表示になっています。

投稿内容に関する注意

k03********さん

編集あり2013/6/123:26:07

ojtnextさん

main()をつけて、書く。
あいまいなことをしていては、理解できない。

上にダニがあらわれた。カンニングはやめて、おまえの知能レベルで書け。

上の上の方、きょろきょろしない。
バカは他人を指導したがる。

quickbrwnfoxjumpsoverthelazydog
こいつはカテのダニ
カンニングはやめる。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる