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 创建的任何内容都不会自动删除,如评论部分所建议的那样。
- 与此相反,变量在超出范围(块、函数、循环等)时会自动删除
我是一名 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 创建的任何内容都不会自动删除,如评论部分所建议的那样。
- 与此相反,变量在超出范围(块、函数、循环等)时会自动删除