分段故障说明



为什么 A 和 B 会导致分段错误。因为即使 x 没有被赋值,它在技术上仍然有一个垃圾值,对吗?另外,为什么 D 不是分割错误?我的答案键说 A 和 B 是分段错误,但这似乎是错误的。D 应该是具有分段错误的那个,因为它试图返回 0。如果我错了,有人可以纠正我吗?

一个。

int x; 
int* p = &x;
cout << p << *p << endl; 

二.

int* p = new int;
cout << p << *p <<endl;

三.

int* p;
cout << p << *p <<endl;

D.

int* p = 0;
cout << p << *p <<endl;
">

即使 x 没有被赋值,它在技术上仍然有一个垃圾值,对吗?" -。它有一个不确定的值,读取它是 UB。

读取未初始化的变量是未定义的行为。您被允许这样做,因此,整个程序是无效的,没有任何意义。 另请参阅 https://en.cppreference.com/w/cpp/language/ub

在您的示例中,A 是 UB,因为打印*p读取未初始化的x的值。B 是 UB,因为p指向的int未初始化。C 是 UB,因为p未初始化。D 是 UB,因为*p取消引用nullptr

你所有的例子都是无效的代码,编译器可以生成它想要的任何结果,它不必告诉你你做错了什么。您有责任了解语言的所有规则并始终遵守它们。

其他推荐阅读材料:

每个 C 程序员都应该知道的关于未定义行为的知识 #1/3

每个 C 程序员都应该知道的关于未定义行为的知识 #2/3

每个 C 程序员都应该知道的关于未定义行为的知识 #3/3

2017 年未定义的行为

C 和 C++ 中未定义行为指南,第 1 部分

C 和 C++ 中未定义行为指南,第 2 部分

C 和 C++ 中未定义行为指南,第 3 部分

为什么 A 和 B 会导致分段错误。

虽然两者都从*p读取未初始化的值,这是未定义的行为,但两者都不会在任何当前系统上产生分段错误。

C 和 D 也有未定义的行为,并且可能会在具有某些编译器和某些优化选项的当前计算机上产生分段错误。无法保证存在分段错误,但很可能在这里。

这是一个关于练习测试的问题,它问的是,其中哪一个会导致分段错误。答案键说是A和B。

您必须颠倒了问题的含义(例如,"其中哪一个会导致分割错误"(,或者答案键是错误的。

最新更新