【问题标题】:pointer and 0xDEADBEEF, why does this code not work? [closed]指针和 0xDEADBEEF,为什么这段代码不起作用? [关闭]
【发布时间】:2013-04-01 02:53:23
【问题描述】:

我正在尝试分析 C++ 程序中的一些代码(我对 C++ 很陌生),但我不明白以下代码试图完成什么。
根据我在这里阅读的线程,设置指向 deadbeef 的指针将使指针为空。但是,Visual Studio 不允许我这样做并给我一个错误。我不知道第二个指针应该做什么。任何输入将不胜感激。

long* firstpointer = (long *)((void *)0);
char* secondpointer = (char*) ((void *)0);

*firstpointer = 0xDEADBEEF;
strcpy(secondpointer,"Here is some text, here is some more");

【问题讨论】:

  • 两者的未定义行为。
  • "根据我在这里读到的线程,设置一个指向 deadbeef 的指针将使指针为空。" -- 哪个线程这么说的?这根本不是真的。
  • “我在 Visual Studio 中遇到错误” -- 什么错误
  • 谁是敌对者?我只是想让你提供可以让人们帮助你的信息。请注意,您的问题现在有 7 个反对票...尝试了解原因。
  • “感谢卡尔的回复,这就是我所需要的。” -- 克里斯在第一条评论中已经说过了。

标签: c++ pointers


【解决方案1】:

根据我在这里读到的线程,设置一个指向 deadbeef 的指针将使指针为空。

不,这是不正确的。虽然deadbeef 是常见的“废话模式”,但绝对等于null。将指针(更一般地,内存区域)设置为已知且不寻常的模式(例如deadbeef)的常见原因是检测未初始化的内存区域。通常用于表示null 指针的全零模式不是很好的候选者,因为在连续内存位置中找到零序列的机会远高于找到deadbeefs 序列的机会。

您在调用strcpy 时看到的崩溃是因为secondpointer 设置为无效值。您需要分配足够的内存以适应 "Here is some text, here is some more" 及其终止零,以使 strcpy 不会表现出未定义的行为。

【讨论】:

  • 这都是真的,但它没有回答 OP 的问题:为什么这段代码不起作用,它试图完成什么,以及第二个指针应该做什么。
  • @JimBalter 我认为,在“什么是死牛”这一点上,问题的后半部分变得不那么相关了。
  • 我不这么认为。什么是 deadbeef 与 OP 的练习完全无关...... 0xDEADBEEF 本来可以是任何东西,但结果相同。
  • @JimBalter 这不是价值本身,而是错误地认为它应该以某种方式等同于null。我添加了有关崩溃的注释。
  • 是否等价于NULL无所谓……如果等价于NULL,结果是一样的。我写了一个真实的答案,但问题在我保存之前就关闭了。 OP有大量错误印象,包括*firstpointer = 0xDEADBEEF设置了指针。
猜你喜欢
  • 2017-08-22
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多