質問: 文字列の受け渡し 先ほど質問したものですが、お願いします。 関数で戻り値として、文字列を扱う場合、 char* sendstr(void){ char* mychar="hello!!\n"; return mychar; } ならうまくいきますが、 char* sendstr(void){ char mychar[]="hello!!\n"; return mychar; } だと、うまくいきません。 配列の場合、mycharで、ポインタと なると、思うのですが。 後者の方が、分かりやすそうですが、 だめなのでしょうか。 (char*は文字型のポインタで、文字列 へのポインタになるのでしょうか)。
回答: #2の方がすでに、理由を説明されていますが、 関数内で宣言した、変数は、その関数を抜けた後は、参照不可能になります。つまり消滅すると考えてかまいません。これを自動変数といいます。 それを前提として char* sendstr(void){ char* mychar="hello!!\n"; return mychar; } の場合は、"hello!!\n"の文字列自体は、関数を抜けても存在します。return mycharで返しているのは、"hello!!\n"の文字列の先頭アドレスです。従って、正常です。 一方、 char* sendstr(void){ char mychar[]="hello!!\n"; return mychar; } の場合は、mychar[]の領域に"hello!!\n"の文字を確保します。その後、return mycharとすると、mychar[]の先頭アドレスを返します。ここで、mychar[]は自動変数ですので、この関数を抜けた後は、消滅します。従って、エラーとなります。(正しく表示できません) もし、 char* sendstr(void){ static char mychar[]="hello!!\n"; return mychar; } のようにした場合は、これは、静的変数といって、この関数を抜けた後も、その内容が保証されます。 従って、その場合は正常に動作します。