量産メモ帳

忘れっぽいのでメモを残しています。浅く適当に書きます。

ローカル変数の戻り値に対する参照の違い。

スポンサーリンク

Java の場合、あるメソッド内部のローカル変数が、そのメソッドの戻り値として返されても、メソッドを呼び出した側は、受け取った変数を参照することができる。


public static String getString() {
String str = "Value of local variable";
return str;
}
public static void main(String[] args) {
String str = getString(); // strを参照できる。
}



しかし、C++ では以下のように記述すると、関数の呼び出しが終わった時点で、たとえ戻り値の参照をコピーしようとしても、値は参照できないようだ。


char * getString() {
cha str[] = "Value";
return str;
}
int main() {
char * str = getString(); // strを参照できない。
}

コンパイルしようとすると、「関数がローカル変数のアドレスを返しています」というエラーメッセージ*1が出力される。


参照できるようにするためには、以下のように書く必要があるっぽい。


char * getString() {
cha * str;
str = (char*) malloc(strlen("Value") + 1);
strcpy(str, "Value");
return str;
}
int main() {
char * str = getString(); // strを参照できる。
}



参考資料:


*1:英語だと"reference to local variable 'str' returned"というエラーメッセージ。