2011-03-15 120 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;