2005年05月04日
C言語 構造体 -3-
前回、構造体の集合体を配列を用いて操作しましたが、 どうもしっくりこないので、他の型と同じように、 ポインタで操作してみました。 構造体の場合は、構造体ポインタ変数が普通の(?) 変数と同じように扱われてしまうので、構造体のポインタの ポインタを用いました。 typedef struct testStruct{ char* str; }testStr , *testPStr; //**************** main ***************************** int main(void){ int i; testStr ts; // 構造体 testStr を用意 testStr* tsp; // 構造体 testStr のポインタ変数を用意 /* ↓これは?? */ testStr** tspp = (testStr**)calloc(10 , sizeof(testStr*)); testStr* tsppt; /* 以下は普通の構造体の使い方 */ ts.str = "aaa"; printf("tsp.str:%s\n" , ts.str); /* 同じ構造体を複数使いたい場合 */ printf("tsのアドレス:%p\n\n" , &ts); for(i = 0; i < 10; i++){ tsp = &ts; *(tspp + i) = &ts; printf("tsp :%p\n" , tsp); printf("*(tspp + i) :%p\n" , *(tspp + i)); /* 以下はコンパイルエラーになる */ // printf("*(tspp + i)->str:%s\n" , *(tspp + i)->str); /* 1回代入してからならOK */ tsppt = *(tspp + i); printf("%s\n\n" , tsppt->str); } } よくわかりませんが、一度ポインタをポインタ変数に 代入してからでないと、コンパイルエラーになってし まい、やむなく上記の方法でやっています。 なんかもっとうまいやり方がありそうですが、検索して もなかったのでこの方法で。 注意しなければならないのが、メモリの確保です。 testStr** tspp = (testStr**)calloc(10 , sizeof(testStr*)); このように確保してから、代入しました。 で、 *(tspp + 2)->str のようには、アクセスできないようです。 tsppt = *(tspp + 2); tsppt->str; // ←これならOK
[ 実行結果 ] tsp.str:aaa tsのアドレス:0xbffff970 tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa tsp :0xbffff970 *(tspp + i) :0xbffff970 aaa
campanella_77 at 15:13│C言語