在c/c++中,是不应该返回局部变量数组的
这是因为在函数中,局部变量是存储在栈内存中的,而函数的返回是值拷贝
因此数组返回实际是返回指向栈内存中这个原数组的首地址,但是函数结束后
该内存是会被自动回收,因此该指向的栈内存是无效的。
但是在实际测试中,却出现一些奇怪的情况
char* get(){
char *a = "temp1";
return a;
}
这个是可以正确打印的,这是因为a是一个指针,其指向的是"temp1"这个常量字符串,而常量字符串是存储在文字常量区的,而返回a其实是返回该文字常量区中该常量字符串首地址
因此即使char *a本身的指针变量被回收,但是其所指向的常量字符串是程序结束后才被回收的,因此是有效的
char* get() {
char a[] = "temp1";
return a;
}
这个你在测试过程中,可能会发现依然能正确的打印出"temp1"这个值,但是并不是说这样就是对的
会出现这个原因你这段代码使用正常,是因为该数组占用的那片内存还没有被覆盖而已,事实上它已经无效了
这端的解释来源网站:http://bbs.chinaunix.net/thread-1553155-1-1.html
若你尝试多使用一些栈内存如
char* get() {
char a[] = "temp1";
return a;
}
char** get() {
char* a[7];
char temp1[] = "temp1";
char temp2[] = "temp2";
char temp3[] = "temp3";
char temp4[] = "temp4";
char temp5[] = "temp5";
char temp6[] = "temp6";
char temp7[] = "temp7";
a[0] = temp1;
a[1] = temp2;
a[2] = temp3;
a[3] = temp4;
a[4] = temp5;
a[5] = temp6;
a[6] = temp7;
return a;
}
然后在打印前面的值char a[]返回的值,你应该就能看到其打印的值可能是乱码或者是char* a[7]中的其中一个值,也就是char a[]在栈中的值其实是无效了,随时会被清除。
因此对于函数返回值,请不要使用局部变量,其在栈内存的数组值,这样会导致不确定的运行状态。