2011-06-22 38 views
2

我正在研究一個產生分段錯誤的程序,我不明白爲什麼。如果我從「最低」和「最大」變量中刪除指針聲明並將它們用作無指針整數,則該程序可以正常工作。爲什麼此指針/整數比較會產生分段錯誤?

但是,只要我嘗試使用指針,就會出現問題,並收到分段錯誤。我意識到這可能是一個很容易解決的問題,但我試圖通過查看其他類似問題來了解代碼。我還沒有找到解決我的問題。我也不明白髮生了什麼問題。

這是代碼生成所述問題(鏈接到完整的源是下面):

 cout << "This is the array containing the random numbers:\n"; 
for(int *i=numbers; i != numbers + arrLength; i++) { 
    if((*i % 200) == 0 && *i > 200) { 
     cin.get(); 
     cout << endl; 
    } 
    else 
     cout << *i << ' '; 

    // Get statistics 
    // In the continuation of getting, lowest, largest then adding to sum. 
    // THIS PART IS MAKING SEGMENTATION FAULT. 
    if(*i < *lowest) 
     lowest = i; 
    if(*i > *largest) 
     largest = i; 
    sum += *i; 
} 

i變量指向舊的參考這是用戶輸入之後宣稱:

cout << "You entered: " << arrLength << "\n\n"; 

int *numbers = new int[arrLength]; 

// Fill the array with random numbers 
srand(time(NULL)); 
int x; 
int range = 5001; 
for(int index=0; index<arrLength; index++){ 
    *(numbers + index) = rand() % range; 
    x = rand() % 2; 
    if(x > 0) { 
     *(numbers + index) = *(numbers + index) * -1; 
    } 
} 

請解釋爲什麼我的程序不工作,我做錯了什麼。正如我前面所說的一切工作,除了:

if(*i < *lowest) 
     lowest = i; 
    if(*i > *largest) 
     largest = i; 

完整的源: http://pastie.org/2105963

在此先感謝對此事!

+0

爲什麼要使用複雜指針運算,而不是使用數組訪問運算符'[指數]'的? – knittl

+0

@ knittl:這可能是C++的作業,教授正在教他們指針算術。 – 2011-06-22 12:12:46

回答

0

您初始化最低,規模最大的爲0,反引用是通過一個空指針訪問內存,因此它倒下。試試這個:

if (!lowest || *i < *lowest) 
    lowest = i; 
if (!largest || *i > *largest) 
    largest = i; 

或:

int *numbers = new int[arrLength]; 
lowest = largers = numbers; // initialise to something non-null 
+0

謝謝,現在它工作完美,我明白我做錯了什麼。 :) – Ms01

2

它不起作用,因爲它不會比較指針。您正在比較存儲在某些內存地址的值,這些地址很可能不屬於您的程序,因此您會被SIGSEGV擊落。

您不能訪問不屬於您的程序的內存。

3
int *largest = 0, *lowest = 0, sum = 0; 

這是你的問題。您永遠不會分配內存或爲其分配有效地址。而當你提領一空指針,喜歡這裏

if(*i < *lowest) //lowest is NULL 

你未定義行爲,其中包括分段錯誤,鼻惡魔,和其他任何

+0

謝謝,現在它工作完美,我明白我做錯了什麼。 :) – Ms01

1

lowestlargest你之前解引用它們初始化?如果最低點不指向有效地址,則使用*lowest將導致段錯誤。

你可以嘗試設置lowest = largest = numbers;開始的某個地方。也許這會幫助你。

1

您的編程使用無效內存(最低和最大指針)。 但是!

指針是沒有必要在此代碼

事實上,程序有一個不需要的複雜性。 爲什麼使用指針,當你可以使用索引?

您將很可能發現您的分配/初始化錯誤。

for(int index=0; index<arrLength; index++){ 
    numbers[index] = rand() % range; 
    x = rand() % 2; 
    if(x > 0) { 
     numbers[index] = numbers[index] * -1; 
    } 
} 

您只需要一個指針來創建數組。

int *numbers = new int[arrayLength]; 

最後你的程序會更簡單:

int lowest =numbers[0], largest = lowest; 
for(int i=0; i < arrLength; i++) { 
    int ii = numbers[i ];      ) 
    if((ii % 200) == 0 && ii > 200) { 
     cin.get(); 
     cout << endl; 
    } 
    else 
     cout << ii << ' '; 

    if(ii < lowest) 
     lowest = ii; 
    if(ii > largest) 
     largest = ii; 
    sum += ii; 
} 
+0

我必須使用指針爲我的任務。 – Ms01

1

要初始化最低&最大價值的指針爲0,然後再解引用他們不將它們指向一個有效的值。

int *largest = 0, *lowest = 0, sum = 0; 
相關問題