こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

動的に生成した文字列の配列を返す関数について

動的に生成した文字列の配列を返す関数について

お世話になります。
動的に文字列の配列を生成する関数を作ったのですが、
配列をうまく受け渡すことができず困っています。

以下のように入力された件数の数だけ
"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");
}

投稿日時 - 2010-01-06 20:59:31

QNo.5572952

すぐに回答ほしいです

質問者が選んだベストアンサー

> 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;
となります。

投稿日時 - 2010-01-06 21:24:21

補足

わかりやすく的確なご回答ありがとうございます。
おかげさまでmainのbfで受け取ることができるようになりました。

投稿した後で気付いたのですが、私が掲載したプログラムは
free()の使い方がまずいように思えます。
以下のように書き直してみたのですが、
もしお手数でなければこれで問題ないかご判断いただければ幸いです。

for(int i=0;i < cnt;i++)
free(bf[i]);

free(bf);

よろしくお願いします。

投稿日時 - 2010-01-07 22:39:48

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>freeの使い方

はい。わたしも後から気づきました。(^^;
それで正しいと思います。

投稿日時 - 2010-01-08 21:52:13

お礼

ご回答ありがとうございます。
おかげさまで確信を持つことができました。

投稿日時 - 2010-01-09 00:15:15

ANo.2

私なら、

>strcpy(nm1[i], "abc ");
>itoa(i, num, 10);
>strcat(nm1[i], num);

この3行を、こう書きます。

sprintf(nm1[i], "abc %d", i);

投稿日時 - 2010-01-06 23:01:38

お礼

ご回答ありがとうございます。
初心者の不慣れなプログラムを1行逃さず精査していただき、
このようにご指摘いただけたことをとてもうれしく思います。
以後、参考にさせていただきます。

投稿日時 - 2010-01-07 22:45:50

あなたにオススメの質問