【发布时间】:2021-06-18 14:46:26
【问题描述】:
我是一名刚接触 C++ 的 Python 程序员。目前在尝试使用指针时出现段错误。有人可以解释这种行为吗?我怀疑cout 有一些我不理解的重要内容。
#include<iostream>
using namespace std;
int main() {
int var; // declaration
cout << "var declared" << endl;
cout << "var : " << var << endl;
cout << "&var : " << &var << endl;
var = 10; // initialization
cout << "\nvar initialized" << endl;
cout << "var : " << var << endl;
cout << "&var : " << &var << endl;
int* ptr; // declaration
cout << "\nptr declared" << endl;
cout << "ptr : " << ptr << endl;
cout << "*ptr : " << *ptr << endl;
cout << "&ptr : " << &ptr << endl;
ptr = &var; // initialization
cout << "\nptr initialized : " << endl;
cout << "ptr : " << ptr << endl;
cout << "*ptr : " << *ptr << endl;
cout << "&ptr : " << &ptr << endl;
return 0;
}
使用此编译器命令
g++ --std=c++14 main.cpp -o main_exec;
此代码产生以下输出
var declared
var : 0
&var : 0x7fff55724478
var initialized
var : 10
&var : 0x7fff55724478
ptr declared
ptr : 0x0
[1] 82727 segmentation fault ./main_exec
这段代码显然可以编译,但在运行时会产生段错误。
我尝试过的事情
我已经尝试将包含*ptr 的行和包含&ptr 的行注释掉的组合,短篇小说是一些组合不会产生段错误。看来我可以使用*ptr 1 次而不是与&ptr 结合使用
【问题讨论】:
-
这与
cout无关。当ptr指向任何内容时(因为它没有被初始化),您正试图访问ptr指向的值。那是未定义的行为。 -
谢谢@Yksisarvinen 使用
int* ptr = new int;留出一个整数值的内存是解决这个问题的合法方式,还是以某种方式错过了重点?有什么理由不总是这样做或至少默认这样做吗? -
new在堆上分配内存,使用完后你有责任delete它。在现代 C++ 中,您通常希望避免使用new(以及一般的原始指针)。如果没有充分的理由使用它,则不应使用它。 -
var = 10; // initialization不,不是,这是任务。ptr = &var; // initialization不,不是,这是任务。初始化和赋值之间的区别在于你缺少什么。 -
@StephenM.Webb 很好,也感谢您澄清这一点。我在想我错过了什么。
标签: c++ pointers segmentation-fault cout