【问题标题】:returning an address of a local variable [duplicate]返回局部变量的地址[重复]
【发布时间】: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


【解决方案1】:

如果你尝试直接用return &x;返回地址,编译器会警告你

它在这里没有警告你的原因是因为编译器“不知道”你已经分配了一个局部变量的地址。编译器根本不够聪明。

【讨论】:

  • 然而,我仍然可以更改该地址的值或通过简单地取消引用来分配它,以防我返回一个指针。如果你是对的,当我试图改变这个值时程序应该已经崩溃了。
  • @ozguncan 为什么程序一定会崩溃?
  • 因为我试图到达一个释放的内存位置。这就是为什么。
  • @ozguncan 这并不能保证崩溃
猜你喜欢
  • 2012-09-07
  • 2013-01-30
  • 2011-04-13
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2013-06-23
相关资源
最近更新 更多