我正在研究一些代码以了解指针的工作方式。我将非指针变量设置为double,这导致了分段错误。我不知道为什么会这样,因为变量没有与程序中的其他任何东西交互。
#include <iostream>
int main() {
int firstValue;
double secondValue = 54.6;
int *p1;
*p1 = firstValue;
p1 = &firstValue;
*p1 = 10;
std::cout << "&firstvalue is " << &firstValue << '\n';
std::cout << "firstvalue is " << firstValue << '\n';
std::cout << "p1 is " << p1 << '\n';
std::cout << "*p1 is " << *p1 << '\n';
}
已存在细分错误;
答案 0 :(得分:0)
我不知道为什么会这样,因为变量没有与程序中的其他任何东西交互。
这是未定义行为的标志。该变量不与其他任何东西直接交互,但是存在于程序中。这足以改变编译器处理未定义行为的方式,有可能将无提示无操作变成崩溃。
[在您的情况下,在为变量分配值之前使用变量的值时,会出现不确定的行为。具体来说,int *p1;
声明了一个变量,但未为其分配值,而下一行中的“ *p1
”使用了p1
的值(将地址移至{ {1}}被复制。同样,此时尚未为firstValue
分配任何值,因此您在同一分配中还会得到另一未定义的行为。实际上,实际上,是导致片段错误的未初始化指针。]
依靠诸如声明新变量来揭示未定义行为的方法不是一个好计划。更好的计划是打开所有编译器警告。这些警告可能会遗漏某些行为未定义的实例,但它们会抓住其中的很大一部分。严重的项目通常需要检查所有(或至少firstValue
)个警告;无法编译无警告的代码会很快被拒绝。因此,您不妨立即学习编写无警告的代码。