c/c++函数返回局部变量数组

来源:互联网 发布:数据库开发与管理 编辑:程序博客网 时间:2024/05/21 05:24

在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[]在栈中的值其实是无效了,随时会被清除。

因此对于函数返回值,请不要使用局部变量,其在栈内存的数组值,这样会导致不确定的运行状态。

0 0
原创粉丝点击