- ベストアンサー
動的に生成した文字列の配列を返す関数について
動的に生成した文字列の配列を返す関数について お世話になります。 動的に文字列の配列を生成する関数を作ったのですが、 配列をうまく受け渡すことができず困っています。 以下のように入力された件数の数だけ "abc 0"~"abc n"という文字列を生成を行っています。 関数自体は期待通りの動作をしているようなのですが、 (Test1関数の最後でbfを確認しました) 呼び出し側にうまく配列を渡すことができません。 以下にソースを掲載いたしますのでどなたかご教示いただけたらと思います。 環境はVisualStudio2005です。 よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> void Test1(char **bf, int *cnt) { int i; int kensu; int charlength; char num[10]; char **nm1 = NULL; char **nm2 = NULL; printf("件数を入力:"); scanf("%d",&kensu); for(i=0; i < kensu; i++) { nm2 = (char**)realloc(nm1, sizeof(char*) * (i + 1)); nm1 = nm2; charlength=128; nm1[i] = (char*)malloc(sizeof(char) * (charlength)); strcpy(nm1[i], "abc "); itoa(i, num, 10); strcat(nm1[i], num); } bf = nm1; *cnt = i; return ; } void main() { int cnt; char **bf = NULL; Test1(bf, &cnt); printf("START\n"); printf("全部で%d件。\n", cnt); for(int i=0;i < cnt;i++) { printf("%s\n",bf[i]); } free(bf); printf("END\n"); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> Test1(bf, &cnt); これは、bfの値(今回はNULL)を関数Test1に渡すことになります。 >bf = nm1; これは、単にTest1関数内のローカル変数に代入しただけなので、呼び出し側のmainのbfには影響ありません。 cntの方は期待通りに動作している筈です。それをbfにも同様に適用します。 cntほうはアドレスを渡してますが、同じようにbfもアドレスを渡す必要があります。 > Test1(&bf, &cnt); 受ける側も、型を合わせます > void Test1(char ***bf, int *cnt) char ** へのポインタなので char ***です。 受け取ったアドレスから実体に代入するので、cntと同様 > *bf = nm1; となります。
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
>freeの使い方 はい。わたしも後から気づきました。(^^; それで正しいと思います。
お礼
ご回答ありがとうございます。 おかげさまで確信を持つことができました。
- asuncion
- ベストアンサー率33% (2127/6289)
私なら、 >strcpy(nm1[i], "abc "); >itoa(i, num, 10); >strcat(nm1[i], num); この3行を、こう書きます。 sprintf(nm1[i], "abc %d", i);
お礼
ご回答ありがとうございます。 初心者の不慣れなプログラムを1行逃さず精査していただき、 このようにご指摘いただけたことをとてもうれしく思います。 以後、参考にさせていただきます。
補足
わかりやすく的確なご回答ありがとうございます。 おかげさまでmainのbfで受け取ることができるようになりました。 投稿した後で気付いたのですが、私が掲載したプログラムは free()の使い方がまずいように思えます。 以下のように書き直してみたのですが、 もしお手数でなければこれで問題ないかご判断いただければ幸いです。 for(int i=0;i < cnt;i++) free(bf[i]); free(bf); よろしくお願いします。