前一阵子 在一位老师的博客中看到了下面的代码
char* get_str(void)
{
char str[] = {"abcd"};
return str;
}
int main(int argc, char* argv[])
{
char* p = get_str();
printf("%s/n", p);
return 0;
}
其中char* get_str(void)这个函数是有问题的,因为它返回了一个指向临时变量的指针,但是下面的代码是没有问题的
char* get_str(void)
{
char* str = {"abcd"};
return str;
}
int main(int argc, char* argv[])
{
char* p = get_str();
printf("%s/n", p);
return 0;
}
我个人觉得 char* str这个指针是在栈里面的,而"abcd"这个常量没有在栈里,所以在指针弹出栈之前返回了指向"abcd"这个常量的地址
可是下面这个例子仍然让我困惑
#include<iostream>
using namespace std;
int* get_str(void)
{
int str = 15;
int * a = &str;
return a;
}
int main(int argc, char* argv[])
{
int* p = get_str();
printf("%d/n", *p);
return 0;
}
我想str这个变量应该也是在栈中,在函数调用完毕后会出栈,可是这个程序可以很好的运行并且输出正确的结果.
如果在子函数中输出a的地址,在main函数中输出p的地址,可以发现这两个的地址是不相同的
这到底是为什么?