分段错误:为什么?

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

谁能解释一下这种行为来自哪里?

Mah*_*esh 8

number未指向有效的内存位置main().只是程序声明了一个指针,number它可以保存整数类型的地址.但是,它未分配/初始化为指向任何整数的位置.

int* number = new int;
*number = 10;
Run Code Online (Sandbox Code Playgroud)

由于该程序正在管理资源,因此应该使用这些资源delete.

delete number;
Run Code Online (Sandbox Code Playgroud)

如果幸运的话,这两个程序都会出现分段错误.


Eri*_*rik 7

在这两个程序中,您将取消引用未初始化的指针.在第一个你很幸运,它没有崩溃.

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)

  • 他很幸运?实际上他非常不走运,因为一个严重的编程错误传来. (3认同)