Dan*_*ilo 2 c++ segmentation-fault
我有这段代码编译和按预期工作:
#include <iostream>
using namespace std;
int fun(int* p){
*p = 20;
return 1;
}
int main(){
int* number;
*number =10;
cout << "before: "<<*number<<endl;
fun(number);
cout << "after: "<<*number<<endl;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
而以下一个给出了分段错误:
#include <iostream>
using namespace std;
int fun(int* p){
*p = 20;
return 1;
}
int main(){
int test=1; //ADDITION
int* number;
*number =10;
cout << "before: "<<*number<<endl;
fun(number);
cout << "after: "<<*number<<endl;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我正在编译使用 g++ test.cpp -o test
谁能解释一下这种行为来自哪里?
number未指向有效的内存位置main().只是程序声明了一个指针,number它可以保存整数类型的地址.但是,它未分配/初始化为指向任何整数的位置.
int* number = new int;
*number = 10;
Run Code Online (Sandbox Code Playgroud)
由于该程序正在管理资源,因此应该使用这些资源delete.
delete number;
Run Code Online (Sandbox Code Playgroud)
如果幸运的话,这两个程序都会出现分段错误.
在这两个程序中,您将取消引用未初始化的指针.在第一个你很幸运,它没有崩溃.
int* number; // number points to a random location - it's not initalized
*number =10; // You write to a random location
Run Code Online (Sandbox Code Playgroud)
用这个:
int number;
number = 10;
...
fun(&number);
Run Code Online (Sandbox Code Playgroud)
或者,使用new分配int:
int * number = new int;
*number = 10;
...
delete number; // always delete what you new
Run Code Online (Sandbox Code Playgroud)