ローカル変数の戻り値に対する参照の違い。
スポンサーリンク
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を参照できる。
}
参考資料:
- プログラミング zroff 警告: 関数がローカル変数のアドレスを返しています - 変更
- C++ compiler warning - returning local variable - Stack Overflow
- Since I can't return a local variable, what's the best way to return a string from a C or C++ function? - Stack Overflow
*1:英語だと"reference to local variable 'str' returned"というエラーメッセージ。