【发布时间】:2021-04-28 15:34:27
【问题描述】:
'''
int* fun(){
int x=5;
int* p=&x;
return p;//problematic part
}
int main(){
int *c=p; //error when int "*c=&x;"
*c=13;
}
'''
当我在主函数中创建一个“整数指针”,然后通过指针 p 将局部变量的地址分配给该“整数指针”,并为该特定地址分配一个新值时,它不会给出任何错误或警告,我认为它应该。因为当我尝试通过“&x”返回“int x”的地址,然后尝试改变它的值时,程序崩溃了。
为什么当我使用“指针p”时程序没有崩溃任何错误?????? 编辑:程序应该崩溃了,这是我的问题,而不是编译器发出警告的原因
【问题讨论】:
-
这是未定义的行为,任何事情都可能发生。它可能会崩溃,也可能不会。
-
问题是证明某些东西指向一个本地对象/不等于停止问题,所以编译器甚至不尝试,他们通常只是在非常明显的情况下发出警告,它是 1000 % 确定代码错误
-
即使代码没有崩溃,或者即使它看起来“正常工作”,这仍然是未定义的行为,并且通过编写这样的代码,您正在为自己(或任何有维护此类代码的挑战)可能极难诊断。不要这样做。
-
我实际上发现了正在发生的事情。当我试图在该地址被释放后到达该地址时,无论编译器是否给出错误,该内存地址都变得可用。因此,如果您(例如)定义 int a[130] 或其他内容,则先前存储在该地址中的值会被 int 数组的垃圾简单地更改。然而在此之前,您仍然可以达到之前定义的值。关键是,编译器就像一个保护层,它不允许你做一些被认为是坏事的特定事情。但这并不意味着内存是这样工作的
标签: c pointers memory-address local-variables