首页 > 解决方案 > 分段故障说明

问题描述

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

一种。

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

B.

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

C。

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

D.

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

标签: c++segmentation-fault

解决方案


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

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

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

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

其他推荐阅读材料:

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

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

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

2017 年未定义的行为

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

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

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


推荐阅读