gpt4 book ai didi

c - 关于c指针的问题

转载 作者:行者123 更新时间:2023-12-02 01:20:51 25 4
gpt4 key购买 nike

这只是我心中的一个疑问

下面是代码

          main()
{
int *p,*q;
int a =20;
p = q;
p = &a;
free(p);
printf("The values of p and q are %d and %d\n",*p,*q);
}

我的疑问是,如果我们释放指针 p,为该指针分配的内存将被释放并返回到空闲内存池,因此在这种情况下,由于 q 也指向 p,取消引用 q 应该会给出错误我的理解。我这样说对吗?我在 dev C++ 编译器中运行了这个程序,令我惊讶的是它显示了两个指针的值。在这种情况下,我们是否将指针 q 称为悬空指针?

提前非常感谢麦迪

最佳答案

尝试在此处释放p会调用undefined behavior - 你只能释放你malloc(或calloc,或realloc,或strdup)的东西。在这种情况下,您将释放一个指向堆栈变量 a 的指针,这是不允许的。

这同样适用于取消引用*q - q 中的值未初始化,因此取消引用它也会导致未定义的行为。严格来说,p = q 也是未定义的*,但在实践中,简单地复制未初始化变量的值往往不会导致太多问题(只是不要指望值才有意义)。

当您调用未定义的行为时,任何事情都可能发生 - 这包括但不限于:

  • 立即崩溃
  • 稍后在一些不相关的代码中崩溃
  • 在不崩溃的情况下损坏一些数据
  • 损坏了磁盘上您认为安全的一些数据
  • 联系您的备份服务器并损坏备份
  • 允许触发错误的黑客控制您的计算机
  • Summoning demons through your nasal passages
  • 上述任意组合
  • 有时什么也没有。

编译器不需要给出任何有用的错误消息,尽管在某些情况下它可能会这样做。

简而言之,不要这样做,但如果你这样做了,也不要指望它会以任何一种特定的方式出现问题。这类事情有一种有趣的破坏方式,看起来像是代码中完全不同部分的错误。

* - 根据 C99 6.2.6.1,如果 C 实现具有指针类型的陷阱表示,则变量的未指定初始值可能是陷阱表示,此时通过 q 读取它 左值调用未定义的行为。

关于c - 关于c指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4756921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com