gpt4 book ai didi

c++ - 取消引用 NULL 指针的哪一部分会导致不良行为?

转载 作者:太空狗 更新时间:2023-10-29 23:22:42 26 4
gpt4 key购买 nike

我很好奇取消引用 NULL ptr 的哪一部分会导致不良行为。示例:

//  #1
someObj * a;
a = NULL;
(*a).somefunc(); // crash, dereferenced a null ptr and called one of its function
// same as a->somefunc();

// #2
someObj * b;
anotherObj * c;
b = NULL;
c->anotherfunc(*b); // dereferenced the ptr, but didn't call one of it's functions

这里我们在 #2 中看到我实际上并没有尝试从 b 访问数据或函数,所以如果 *b 只是解析为 NULL 并且我们将 NULL 传递给 anotherfunc() ,这仍然会导致不良行为?

最佳答案

在标准中有一个空指针值的概念。这是一个独特的值,当程序试图通过它访问内存时会导致未定义的行为。实际上,许多现代实现都会使程序崩溃,这是有用的行为。毕竟,这样的尝试是错误的。

空指针值的名称是 0,或指针上下文中的任何其他常量整数表达式(例如 3 - 3)。还有一个 NULL 宏,在 C++ 中它的计算结果必须为 0 但在 C 中可以是 (void *)0 (C++ 更强调指针是类型安全的) .在C++0x中,会有一个显式的值叫做nullptr,最后给空指针一个显式的名字。

空指针的值不一定是实际的零,尽管它在我所知道的所有实现中都是如此,而且那些不起作用的奇怪计算机大多已经淘汰。

您错误地陈述了上一个示例中发生的情况。 *b 没有解析成任何东西。传递 *b 是未定义的行为,这意味着实现可以用它做任何它喜欢的事情。它可能会或可能不会被标记为错误,并且可能会或可能不会导致问题。行为可以无缘无故地改变,所以这样做是错误的。

如果被调用函数需要一个指针值,向它传递一个空指针值是完全合法的,被调用函数应该正确处理它。取消引用空指针值永远是不合法的。

关于c++ - 取消引用 NULL 指针的哪一部分会导致不良行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110111/

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