- 締切済み
構造体とポインタ配列
現在C言語の勉強をしております。 環境はwindowsXP、コンパイラはVC6.0です。 構造体と、ポインタの配列についてなのですが、 以下のような構造体が宣言されている時に、リスト構造にデータがいくつか入っているとします。 // 構造体 typedef struct address { unsigned char names[NAME_SIZE+1]; /* 名前 */ char tels[TEL_SIZE + 1]; /* 電話番号 */ struct address *prev; /* 前へのポインタ */ struct address *next; /* 次へのポインタ */ }Address, *a_pt; そのリスト構造を先頭要素か順番にポインタ配列に格納するには以下の方法ではおかしいでしょうか? /* ポインタ配列を用意する */ Address *array[MAX_COUNT]; /* top_ptは先頭のポインタです */ pt = top_pt; /* データがなくなるまで配列へ格納する */ while(pt != NULL){ array[count++] = pt; pt = pt->next; } /* 配列の最後はNULLとする */ array[count] = NULL; また、配列の中身を確認する方法としては、 printf("配列の中身:%s\n", array[0]->names); では、アドレスが表示されてしまうのかな・・と思ったら、accessViolationで落ちてしまいました・・・。 中身はどうしたらデバッグ出来ますでしょうか? そもそも、以下の2つは何か違いはありますか? Address *ptA[100]; a_pt ptB[100]; 皆さん、どうかよろしくお願いいたします。 理解不能な場合はご指摘ください。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- min_is
- ベストアンサー率25% (1/4)
2番目の方も書いておられますが、 そもそものリストデータの作成に失敗していませんか? エラーが発生している場所だけでなく、そのデータを生成 しているところや、関数引数や戻り値など、データを伝播 しているところを確認してみてはいかがでしょうか? ローカル変数でリストのデータ本体を作成し、そのアドレスを 返却するような関数を使って、リストを作成している場合など こんな感じのエラーになるかもしれません。
- D-Matsu
- ベストアンサー率45% (1080/2394)
ちょっと追加というか修正です。 #1見て思い出したので。 > Address *ptA[100]; > a_pt ptA[100]; この二つは同じ結果になりますが、 > Address *ptA[100], ptB[100]; > a_pt ptA[100], ptB[100]; は同じになりません。 前者は struct address *ptA[100]; struct address ptB[100]; 後者は struct address *ptA[100]; struct address *ptB[100]; とコンパイラに解釈されます。
お礼
ご回答ありがとうございます。 参考にさせていただきます。
- D-Matsu
- ベストアンサー率45% (1080/2394)
基本的によさそうに見えますが、whileループはMAX_COUNT回数回った時点でも抜けるようにしましょう。 > printf("配列の中身:%s\n", array[0]->names); > では、アドレスが表示されてしまうのかな・・と思ったら、accessViolationで落ちてしまいました・・・。 提示コード内に書かれていないので気になるのですが、ちゃんとcountを初期化してから入れ始めていますか? あとは printf("配列の中身:%s\n", top_pt->names); が同じようにエラーになるなら元データからおかしい状態ですね。 > そもそも、以下の2つは何か違いはありますか? > Address *ptA[100]; > a_pt ptB[100]; a_ptがstruct address *としてtypedefされているので同じ型になります。違いはありません。
お礼
ご回答ありがとうございます。 >基本的によさそうに見えますが、whileループはMAX_COUNT回数回った時点でも抜けるようにしましょう。 ご指摘ありがとうございます。実装いたします。 countは初期化しております。「int count = 0」 >printf("配列の中身:%s\n", top_pt->names); は、問題なく出力されます。
- Yanch
- ベストアンサー率50% (114/225)
まさかと思いますけど、 accessViolationが出る理由が > unsigned char names[NAME_SIZE+1]; /* 名前 */ unsigned char型で宣言されているとかではないですよね? char型にしてみるとどうなりますか。 >そもそも、以下の2つは何か違いはありますか? > >Address *ptA[100]; >a_pt ptB[100]; typedefの宣言を見ればわかると思いますが、 >Address *ptA[100]; は、struct address 型のポインタの配列を100個用意する。 >a_pt ptB[100]; は、struct address へのポインタ型の配列を100個用意する。 となります。 C言語において、この2つは大差ない動きをします。
お礼
ご回答ありがとうございます。 >char型にしてみるとどうなりますか。 同じ箇所で落ちてしまいました。 >C言語において、この2つは大差ない動きをします。 ありがとうございました。
お礼
リストデータは問題なく作成出来ています。 画面には全データを表示出来ているんですが、qsort関数でソートする目的で、配列にデータを入れようと思っております。 ありがとうございました。 参考にさせていただきます。