2011-03-15 163 views
2

我有这样的一段代码,编译和按预期工作:分割错误:为什么?

#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

可有人给我解释一下编译这种行为来自哪里?

回答

8

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

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

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

delete number; 

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

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); 

或者,分配INT:

int * number = new int; 
*number = 10; 
... 
delete number; // always delete what you new 
+3

他很幸运?事实上,他非常不幸,因为一个严重的编程错误通过。 – Benoit 2011-03-15 17:06:22

+0

或者:'int * number = &test;' – 2011-03-15 17:08:11

+0

我同意Benoit。对于UB这样的_not_ crash是_unlucky_。 – 2011-03-15 19:32:52

2

无论你的程序具有不确定的行为,由于int* number不被初始化为一个有效的指针。这只是平局的运气,一方失败而另一方失败。尝试

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

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

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

这现在好了!

1

行为来自这样的语句:

int* number; 
*number =10; 

访问一个未初始化的指针在您输入“未定义行为”的国家。你在程序的其余部分继续这样做,但是在*number = 10未定义之后整个事情的表现如何。它可能工作,它可能会崩溃它可能会告诉你1 + 1 = 15或其他任何。简单地说:你不能取消引用(或访问后面的数据)未初始化的指针。

干杯,

保罗

1

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

1

你忘了为你的number指针分配空间。发生这种情况时,程序行为是不确定的。它恰好在一个案例中运行,但不在后面。

要么改变你的变量,以普通int,

int number = 10; 

或做new他们

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