ページ 11

char**型の関数

Posted: 2007年7月07日(土) 21:20
by ini
char **Word(char* --, int --){
 char **str;
 .
 .
 .
 return str;
}

上のような、返り値がchar**のような関数を作ったのですが、
たとえばmain関数で関数Word(char** --, int --)を呼び出して、
main関数内でstr[0]やstr[1]などを表示させるにはどうしたら良いのでしょうか。

Re:char**型の関数

Posted: 2007年7月07日(土) 21:57
by Hermit
char **Word() 内で auto 確保された領域は、
Word() を抜けると開放される為、他の領域では使用できません。

main() 関数内で参照できる範囲に、str 配列を作る必要があります。

Re:char**型の関数

Posted: 2007年7月07日(土) 23:37
by ini
回答ありがとうございます!

main関数でchar**型の、たとえばdataというのは、
関数char **Word()内でdataを表示させることが出来ますよね?
それの反対を考えていたのですが、それも出来ないのでしょうか?

もし出来ないのであれば、どうすれば関数char **Word()内のstrを
main関数内で表示させることが出来るでしょうか?

まだまだ勉強中なので、伝わらないこともあるかも知れないのですがよろしくお願いしますm(__)m

Re:char**型の関数

Posted: 2007年7月08日(日) 00:55
by Hermit
>関数char **Word()内でdataを表示させることが出来ますよね?
>それの反対を考えていたのですが、それも出来ないのでしょうか?

auto で確保した領域でなければいいのです。

str は、そのままポインタを返すので問題ありません。返却した値を他の変数に代入すればいいので。
char **ptr = Word(char** --, int --);
とすれば、ptr[?] などでかまいません。

次に、*str (char のポインタ配列)と、**str (char 配列)をどこで確保しているかということです。
malloc で領域確保したり、static エリアを用意したり、外部領域で確保していたりすれば、
そのまま Word の返却値がつかえます。

この二つの部分を、auto で取ると、Word を抜けた時点で開放されるので、
コンパイラはその部分を使う命令を出すかもしれませんし、(他のデータで上書きする)
または、使用禁止区域にしてしまうかもしれません。(バスエラーなど)
または、何事も無かった様に使用できるかもしれません。

ですので、auto で確保した領域は使用できません。
逆に言うと、auto で確保しなければ、使用できます。