分段错误:为什么?

时间:2011-03-15 16:50:51

标签: 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;
}

虽然以下内容给出了分段错误:

#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;
}

我正在使用g++ test.cpp -o test

进行编译

有人可以解释一下这种行为的来源吗?

7 个答案:

答案 0 :(得分:8)

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

int* number = new int;
*number = 10;

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

delete number;

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

答案 1 :(得分:7)

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

int* number; // number points to a random location - it's not initalized
*number =10; // You write to a random location

使用此:

int number;
number = 10;
...
fun(&number);

或者,使用new:

分配int
int * number = new int;
*number = 10;
...
delete number; // always delete what you new

答案 2 :(得分:2)

由于int* number未初始化为有效指针,因此两个程序都有未定义的行为。这只是抽签的运气,一方失败而另一方则没有。尝试

int* number = new int;

答案 3 :(得分:2)

int* number;    
*number =10;

number是指向int的指针。你需要分配内存,以便它可以指向有效的内存!

int *number = new int;
*number = 10;

现在好了!

答案 4 :(得分:1)

行为来自这样的陈述:

int* number;
*number =10;

取消引用未初始化的指针后,您已进入“未定义的行为”国家/地区。你继续在程序的其余部分中执行此操作,但在*number = 10未定义之后整个事情的行为如何。它可能会起作用,它可能会崩溃它可能会告诉你1 + 1 = 15或其他什么。简单地说:你不能解除引用(或访问后面的数据)未初始化的指针。

干杯,

答案 5 :(得分:1)

我不认为“int test = 1”在这种情况下具有任何意义。但是,整数指针在初始化时指向随机数(表示随机存储器位置)。尝试执行以下操作:使用number = new int()替换* number = 10的出现次数; *数= 10;进行这样的初始化时,将从堆分配给指针。并且不要忘记使用“删除”操作符删除程序末尾的指针。

答案 6 :(得分:1)

您忘了为number指针分配空间。发生这种情况时,程序行为未定义。事实恰恰相反,在一种情况下它会运行,但不会在后期运行。

将变量更改为plain int,

int number = 10;

或对其进行new

int *number = new int[1];
*number = 10;