关于返回指向临时变量指针的困惑

前一阵子 在一位老师的博客中看到了下面的代码

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的地址,可以发现这两个的地址是不相同的

 

这到底是为什么?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值