【问题标题】:Memory Address and values in memory address内存地址和内存地址中的值
【发布时间】:2015-10-05 05:43:57
【问题描述】:

我有点困惑。

struct node *p; and if(p==NULL)

现在我根据我的研究收集到的是,NULL 不是内存地址,而是内存地址中的一个值(即 0)。当我使用if(*p==NULL) 时,它会给出一个错误——'operator==' 不匹配。但是*p 没有给出内存地址中的值。如果我们只使用p,我们不是将内存地址与内存地址中的值进行比较。为什么p==NULL 正确而*p=NULL 不正确。

【问题讨论】:

  • NULL 的概念是预定义的不可引用的内存区域。它是(理想情况下)在正确分配指针之前初始化指针的地方。传统的空检查应用于指针本身而不是取消引用它(这是 UB 并且可能导致段错误)
  • NULL 与指针一起使用。这里if(p==NULL)p是一个指针,可以和NULL比较(假设p是一个全局变量,所以它会自动初始化为NULL)。但是这里 if(*p==NULL)*p 的类型是 struct node ,这不是指针。
  • 如果你收集到了,你真的需要更好的学习材料。
  • @M.M 我真的在寻找答案,但我会根据你的建议采取行动。

标签: c pointers null structure


【解决方案1】:

是的,*p 给出了内存地址中的值。但在这种情况下,该值是struct node,因为p 的类型是“指向结构节点的指针”。您不能将结构的值与 NULL 进行比较。

【讨论】:

    【解决方案2】:

    如果我们只使用p,我们不是将内存地址与内存地址中的值进行比较

    没有。当我们谈论 NULL 时,根据 C11 标准,第 7.19 章,<stddef.h>,(强调我的)

    NULL
    扩展为实现定义的空指针常量;[...]

    所以,NULL 是一个指针,在您的代码中,p 也是如此。所以,你可以比较它们。

    OTOH,*p 是一个值,您无法将其与 NULL 进行比较。

    【讨论】:

    • 我对 null 的想法不正确。终于明白了。
    • @Rishab 注意:null 和 NULL 是一回事。
    【解决方案3】:

    我认为您在这里对 NULL 有误解。 NULL 实际上起到了地址的作用——它是一个指针无效的值。无法检索地址为 NULL 的内存。 NULL 不是存储在指针中的值。 NULL 是一个指针,虽然它依赖于系统,但它通常指向内存地址 0,我认为这是造成混乱的根源。

    NULL 相当于指针(通常定义为 (void *)0 )。从 void * 到 struct node 的转换会给出编译器警告并且没有意义。

    另外将 *p 与 NULL 进行比较涉及首先取消引用 p(即 UB)

    NULL 的值可能为 0,但它并不意味着要与任何不是指针的东西进行比较。因此,正如评论者所说,要解决您的问题,您必须将比较从

    if (*p == NULL)
    

    结构与内存地址的比较

    if (p == NULL)
    

    将内存地址 p 与存储在 NULL 中的地址值进行比较。

    【讨论】:

    • 这句话:If NULL was equal to zero, and was stored at a certain memory address, then any time you had a pointer to some variable with a value of zero it would be equal to NULL and that just doesn't make sense
    • 我试图解决原始帖子中的混乱。 Rishab 说他的理解是 NULL 是一个值,即 0,并且通过取消引用指针并将其与 NULL 进行比较,他可以判断某物是否存在。我的尝试是明确表示,例如,如果你有 int *i = 0,在他看来,将该指针的取消引用与 NULL 进行比较会告诉他它是否是一个有效的指针。如果他的观点是正确的,那么如果一个指针指向任何等于零的值,就无法判断它是否为 NULL。如果原句措辞混乱,我很抱歉。
    • 该死,我的错。我实际上读过 [link]cplusplus.com/reference/cstring/NULL 这就是为什么我说 NULL 为零。
    • @forsooth 指针存储 NULL (通常定义为零)确实有意义。通常的对象检查代码将使用pointer = malloc(20*sizeof(char)); if(!pointer)... 之类的东西。所以在实际使用中,我们确实有值为零的指针,我们将其与 NULL 作为标准做法进行比较。 c 标准没有将 NULL 定义为零,但在大多数实现中它是
    • 我知道,我明白你为什么投反对票,不用担心。我更想纠正这样的误解,即 NULL 应该与任何不是指向指针的指针的取消引用进行比较。我的意思是“NULL 不等于零”,因为 NULL 不是可以与任何指针的内容进行比较的神秘值 0,而是指向内存中地址 0(通常)的指针。
    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2020-12-28
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2011-10-15
    相关资源
    最近更新 更多