【问题标题】:Can pointer point to itself memory address in C?指针可以在C中指向自身的内存地址吗?
【发布时间】:2017-08-19 07:39:50
【问题描述】:

在下面的代码中,一个指针指向它自己的内存地址。

#include <stdio.h>

int main() 
{
    void * ptr;
    ptr = &ptr;

    return 0;
}

如果指针能够指向它自己的内存地址,这有意义吗?

【问题讨论】:

  • 您希望错误或警告说什么?也就是说,这里的(甚至潜在的)问题是什么?
  • 我猜这属于“奇怪,但如果你坚持这样做,没有问题”。

标签: c pointers memory-address


【解决方案1】:

不,这没有意义。 如果你能找到变量 ptr,你可以做 &ptr。 它将为您提供与 ptr 内容相同的结果。

此外,由于 ptr 只讲述了自己的一些信息,所以无论如何它都没用。它不会提供任何对您程序的其余部分有意义的信息。

想一想,有一个例外。您可以将 ptr == &ptr 的情况用作一种特殊值,例如 NULL。所以,在那种情况下,我会认为它很有用。

它的乐趣在于,在这种情况下,值 &ptr 作为一个特殊值是有意义的,而作为某物的地址却没有意义,就像 NULL。

【讨论】:

  • 你的回答越来越多了,Ciceroian 回答 .... ;-) 还是 was it 苏格拉底还是柏拉图?
  • 遗憾的是,在几乎所有情况下,如果类型不同,您就无法在没有强制转换的情况下进行比较 ptr == &amp;ptr
  • 是的,我会为此编写一个带有 ref 参数的模板函数......但它效率不高。另一方面,有两个特殊值本身就很了不起。
  • 这在什么方面比'ptr = ptr'更有意义?
  • @ScottHunter:我认为你的例子不能与void * ptr = ptr; 相比是不合法的。
【解决方案2】:

指针指向自己的内存地址

这是合法的。

它是否“有意义”100% 取决于上下文以及“主要基于选项”。

【讨论】:

    【解决方案3】:

    这是有道理的,因为它是合法的 C 语言赋值。另一个问题是为了什么。 IMO 这只是学术考虑,没有任何实际用途。

    【讨论】:

    • 并非所有合法的东西都有意义......我可以例如在我的车上粘上墙纸。
    • 同意@PeterJ
    • @PeterJ 我读过,但对我来说“有意义”意味着“有目的”。
    • 从完整语句中取出的单词称为操纵。我写的很清楚,没有任何实际用途
    • 别太认真,你的意思说的很清楚,没问题!我只是在吹毛求疵,因为我还没吃早餐!
    【解决方案4】:

    另一个尚未提及的方面是它违反严格类型。
    如果ptr的类型为void *,那么&amp;ptr的类型为void **,由于类型不匹配(void *vs.void **)不应分配给ptr
    然而,当涉及到指针类型时,C 和 C++ 通常非常宽松,每当分配给 void * 时,因为 void * 应该能够指向几乎任何东西。
    但是假设你真的想正确地取消引用ptr,你会(在你分配之后)必须这样做

    *(void **)ptr = ...

    假设您确实想在某个时候取消引用它。

    【讨论】:

    • "它违反了严格类型。" 在 C 中,void-pointers 没有这样的规则。在 C 中,从/到任何其他指针类型的 void-pointer 转换是合法的。在 C+ 中不是。
    • 其实我的帖子里有,但是不坚持严格的打字还是不好的风格,所以我觉得值得一提。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多