c++ 段错误和指针混淆(我觉得我错过了一些非常明显的东西)

c++ segfault and pointers confusion (I have the feeling I'm missing something terribly obvious)

我是一名 python 刚接触 C++ 的程序员。目前在尝试使用指针时遇到段错误。有人可以解释这种行为吗?我怀疑 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

结合使用

您声明了一个指向整数的指针,但未对其进行初始化或分配任何指针(即指向整数变量的内存地址)。

int* ptr; // declaration

上面的行说,ptr 是一个指针(指向整数变量的内存地址)。在你的情况下,它只是说它是一个指针,它指向的是什么没有定义。

当你点击这条线时,

cout << "*ptr            : " << *ptr << endl;

这里 *ptr 的意思是,获取地址(实际存储该值的地址)的值并由 ptr[=43= 指向].但是 ptr 没有指向任何内容。所以你试图以一种不允许的方式访问内存,这会导致分段错误。

请记住,指针是可变的,因为它们的值存储另一个变量的内存地址。

int *ptr; // would store memory address of an integer type variable.
int a = 5; // would store an integer variable.
ptr = &a; // Here &a gets the address of variable a and stores in *ptr
cout<<*ptr // Here *ptr gets the value of variable whose memory address is pointed to by *ptr.

编辑

回答问题 int * ptr = new int; 是否有效。

是的,它会为您保留一个内存位置,并允许您稍后在该位置存储值,如下面的代码所示,

int* ptr = new int;  // gets memory address and assigns to *ptr
*ptr = 5; // assigns value 5 to the memory being pointed by *ptr
cout<<*ptr; // output 5

但是,除非您有特殊需要,否则不应这样做。

  • 变量为您保留内存,并为您提供一个您选择的友好变量名称。
  • 您使用 new 创建的任何内容都不会自动删除,如评论部分所建议的那样。
  • 与此相反,变量在超出范围(块、函数、循环等)时会自动删除