【问题标题】:what is a null pointer in cc中的空指针是什么
【发布时间】:2018-04-07 22:14:09
【问题描述】:
#include <stdio.h>

int main(void)
{
    struct findEntry
    {
        int value;
        struct entry *next;
    };

    struct entry n1, n2, n3;
    struct entry *list_pointer = &n1;

    n1.value = 100;
    n1.next = &n2;

    n2.value = 200;
    n2.next = &n2;

    n3.value = 300;
    n3.next = (stuct entry *) 0;

    while (list_pointer != (struct entry *)0) {
        printf("%i\n", list_pointer->value);
        list_pointer = list_pointer->next;
    }
    return 0;
}

我不明白(struct entry *) 0 的语法在这里是什么意思。在我正在阅读的书中,它说它是一个空指针。我尝试在网上查找,但我不知道该输入什么。我得到的“NULL 指针”的 Google 搜索结果与我的预期不同。

【问题讨论】:

  • n2.next = &amp;n2; 中还有一个拼写错误,这意味着我们永远无法到达n3。我会扔掉这个不好的例子并研究一些其他代码。
  • (struct entry *)0 只是写NULL 的不好方式。买一本新书。
  • 请注意,您的代码定义了一个类型struct findEntry,其中包含一个指向不完整类型struct entry 的指针。您不能定义 n1 等,因为 struct entry 是不完整的类型。定义struct entry 而不是struct findEntry 所需的更改最少——或者您可以将struct entry 更改为struct findEntry。此外,n3.next = (stuct entry *) 0; 中有一个错字——struct 中有一个 r。请 — 发布可编译的代码!
  • 另外,n2.next = &amp;n2; 行在列表中为您提供了一个循环,而n3 未使用。代码编译后,您的打印循环将运行很长时间。
  • 我认为代码作者使用的是C++编译器。

标签: c pointers null


【解决方案1】:

任何值为 0 的指针类型都称为空指针。以下是 C 标准 §6.3.2.3 的解释:

  1. 值为 0 的整数常量表达式,或这样的表达式 强制转换为 void * 类型称为空指针常量。如果一个空 指针常量转换为指针类型,结果 指针,称为空指针,保证比较不等于 指向任何对象或函数的指针

【讨论】:

    【解决方案2】:

    空指针是一个指向内存地址 0 的指针。大多数系统保留这个地址,这样就不会有任何对象驻留在那里。此保留允许将其用作空白地址。

    如果您尝试从空指针读取或写入,您将得到运行时错误,有时称为分段错误或空指针异常。

    在您的示例中,空指针用于指示列表的结尾。所以这个条件(struct entry *) 0,检查你是否已经到达列表的末尾并且迭代应该停止

    通常认为使用常量 NULL 代替字面值 0 是更好的形式。这使代码更具可读性,并且还涵盖了 NULL 指针不是 0 的极少数情况

    强制转换(struct entry *) 只是为了避免编译器警告,因为字面量 0 是整数类型而不是指针。这是使用常量 NULL 的另一个原因,因为它通常被定义为 (void*) 0,它可以很好地与任何指针值进行比较,而不会来自编译器的警告

    【讨论】:

    • 请注意,0 是一个完全令人满意的空指针常量。一些编译器可能会对此发出警告,但标准绝对不需要任何此类警告。根据标准,使用没有强制转换的普通 0 是合法的。
    【解决方案3】:

    它与 C 标准中定义的 (void *)0 的 NULL 完全相同。

    【讨论】:

    • (void *)0不完全一样,因为类型不同(一个是void指针,另一个是struct entry *)。
    • 我敢打赌,原作者使用的是 C++ 编译器并且遇到了错误。这就是这个奇怪的(在 C 中)赋值的可能原因。
    • C11 §7.19 Common definitions &lt;stddef.h&gt; ¶3 说:宏是NULL,它扩展为实现定义的空指针常量; … 并且一个空指针常量被定义为medalib 在他们的answer 中引用。它不一定是(void *)0,尽管这是一个被广泛使用的非常常见的值。
    【解决方案4】:

    空指针被初始化为无效指针或被标记为未初始化。 NULL 指针也可用 而不是下一个指针,因此也表示列表的结尾。

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 2012-01-21
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      相关资源
      最近更新 更多