返回指向局部变量的指针 怎么还能通过地址找到值呢?

时间:2021-10-03 03:28:40
局部变量在函数结束后释放,那么主函数为什么还能通过地址访问到内容呢?
#include <stdio.h>

int* fun()
{
    int b = 6;
    int *p = &b;
    return p;
}
int main(void)
{  
    int ch;
    int *t = fun();
    ch = *t;
    printf("%d",ch);
    return 0;
}


#include <stdio.h>

int** fun()
{
    int a = 6;
    int *p = &a;
    int **pp = &p;
    return pp;
}
int main(void)
{  
    int ch;
    int **ppi = fun();
    int *pi = *ppi;
    ch = *pi;
    printf("%d",ch);
    return 0;
}

10 个解决方案

#1


释放的意思是你不管了,你不管了不代表别人立刻就要接管,别人什么时候接管,跟你没关系

#2


这就是C这等高档语言的强悍之处,只要有个地址,想读就读想写就写,完全不用管它是啥

#3


你这个肯定有编译告警的吧,因为用了未知地址的值。

#4


引用 3 楼 whiteyundd 的回复:
你这个肯定有编译告警的吧,因为用了未知地址的值。

没有警告,直接通过

#5


引用 4 楼 meiskim 的回复:
引用 3 楼 whiteyundd 的回复:你这个肯定有编译告警的吧,因为用了未知地址的值。
没有警告,直接通过


不知道你用的是什么编译器,新一点的编译器都能检查出这种错误了。

#6


引用 5 楼 whiteyundd 的回复:
引用 4 楼 meiskim 的回复:引用 3 楼 whiteyundd 的回复:你这个肯定有编译告警的吧,因为用了未知地址的值。
没有警告,直接通过

不知道你用的是什么编译器,新一点的编译器都能检查出这种错误了。


是warning不是error,所以可执行文件还是编译得出来,就是有告警。

#7


引用 6 楼 whiteyundd 的回复:
引用 5 楼 whiteyundd 的回复:引用 4 楼 meiskim 的回复:引用 3 楼 whiteyundd 的回复:你这个肯定有编译告警的吧,因为用了未知地址的值。
没有警告,直接通过

不知道你用的是什么编译器,新一点的编译器都能检查出这种错误了。

是warning不是error,所以可执行文件还是编译得出来,就是有告警。


嗯~~,不过还是有点不明白,既然地址存储的内容被释放了,怎么还能通过地址找到值呢

#8


引用 7 楼 meiskim 的回复:
嗯~~,不过还是有点不明白,既然地址存储的内容被释放了,怎么还能通过地址找到值呢


你自己假象的等式和推导:函数返回==局部变量在函数结束后(立即)释放==地址存储的内容(立即)被释放==不能通过地址找到值

而事实则如#1楼所说的

#9


这个地址是一直在那个地方的。
只是暂时还没用被其他程序占用。
不要太纠结了,这个不符合C语言的规范写法,
如果做项目的话,这样的代码是会出问题的,
可以看些编程规范的东西,有助于理解和写成优质的代码

#10


引用 9 楼 whiteyundd 的回复:
这个地址是一直在那个地方的。
只是暂时还没用被其他程序占用。
不要太纠结了,这个不符合C语言的规范写法,
如果做项目的话,这样的代码是会出问题的,
可以看些编程规范的东西,有助于理解和写成优质的代码


刚才用VS2010编译也能通过,地址内容没有马上释放,等到有调用函数时就释放了,虽然地址没有被占用。

#1


释放的意思是你不管了,你不管了不代表别人立刻就要接管,别人什么时候接管,跟你没关系

#2


这就是C这等高档语言的强悍之处,只要有个地址,想读就读想写就写,完全不用管它是啥

#3


你这个肯定有编译告警的吧,因为用了未知地址的值。

#4


引用 3 楼 whiteyundd 的回复:
你这个肯定有编译告警的吧,因为用了未知地址的值。

没有警告,直接通过

#5


引用 4 楼 meiskim 的回复:
引用 3 楼 whiteyundd 的回复:你这个肯定有编译告警的吧,因为用了未知地址的值。
没有警告,直接通过


不知道你用的是什么编译器,新一点的编译器都能检查出这种错误了。

#6


引用 5 楼 whiteyundd 的回复:
引用 4 楼 meiskim 的回复:引用 3 楼 whiteyundd 的回复:你这个肯定有编译告警的吧,因为用了未知地址的值。
没有警告,直接通过

不知道你用的是什么编译器,新一点的编译器都能检查出这种错误了。


是warning不是error,所以可执行文件还是编译得出来,就是有告警。

#7


引用 6 楼 whiteyundd 的回复:
引用 5 楼 whiteyundd 的回复:引用 4 楼 meiskim 的回复:引用 3 楼 whiteyundd 的回复:你这个肯定有编译告警的吧,因为用了未知地址的值。
没有警告,直接通过

不知道你用的是什么编译器,新一点的编译器都能检查出这种错误了。

是warning不是error,所以可执行文件还是编译得出来,就是有告警。


嗯~~,不过还是有点不明白,既然地址存储的内容被释放了,怎么还能通过地址找到值呢

#8


引用 7 楼 meiskim 的回复:
嗯~~,不过还是有点不明白,既然地址存储的内容被释放了,怎么还能通过地址找到值呢


你自己假象的等式和推导:函数返回==局部变量在函数结束后(立即)释放==地址存储的内容(立即)被释放==不能通过地址找到值

而事实则如#1楼所说的

#9


这个地址是一直在那个地方的。
只是暂时还没用被其他程序占用。
不要太纠结了,这个不符合C语言的规范写法,
如果做项目的话,这样的代码是会出问题的,
可以看些编程规范的东西,有助于理解和写成优质的代码

#10


引用 9 楼 whiteyundd 的回复:
这个地址是一直在那个地方的。
只是暂时还没用被其他程序占用。
不要太纠结了,这个不符合C语言的规范写法,
如果做项目的话,这样的代码是会出问题的,
可以看些编程规范的东西,有助于理解和写成优质的代码


刚才用VS2010编译也能通过,地址内容没有马上释放,等到有调用函数时就释放了,虽然地址没有被占用。