#18926: 想請問Segfault的原因


asd5581284 (mao)

學校 : 國立交通大學
編號 : 100629
來源 : [180.204.76.125]
最後登入時間 :
2019-08-22 10:27:31
a225. 明明愛排列 | From: [180.204.76.125] | 發表日期 : 2019-08-14 20:39

#include <iostream>
using namespace std;

int main()
{
int num;
int array[num];

//cout << "How many numbers: ";
while( num != EOF )
{
cin >> num;
for( int i = 0 ; i<num ; i++ )
{
cin >> array[i];
}

int sb;

for ( int j = 0 ; j<num ; j++ )
{
for( int i = 0; i<num-1 ; i++ )
{
if ( array[i] % 10 > array[i+1] % 10 )
{
sb = array[i+1];
array[i+1] = array[i];
array[i] = sb;
}

if ( (array[i] % 10 == array[i+1] % 10) && (array[i] < array[i+1]) )
{
sb = array[i];
array[i] = array[i+1];
array[i+1] = sb;
}

}
}

for( int i = 0 ; i<num ; i++ )
{
cout << array[i] << " ";
}
cout << endl;

}

}

 
#18927: Re:想請問Segfault的原因


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
a225. 明明愛排列 | From: [49.158.83.43] | 發表日期 : 2019-08-14 20:59

您的程式碼裡有兩條:

int num;

int array[num];

宣告了 num 之後立即作為 array 陣列的大小宣告。但是 num 是剛才配置記憶體的變數,因此不知其值。

所以 array 陣列大小未知,因此基本上會出現 Runtime Error (Segmentation Fault)。

 

修改方式為有兩種直覺的方式:

一是因為 num 最大到 1000,因此直接將 array 陣列宣告成大小 1000 ;

二是當輸入進 num 值時,此時再以同樣的語法宣告 array 陣列大小,就不會出錯了。

 

 

 

此外,您的程式碼裡有這麼一行:

while( num != EOF )

而下面接著

cin >> num 

這樣子程式是無法結束的,因為就算讀到 EOF , num 也不會變成 EOF 的值。

 

可以將其寫作

while ( cin >> num )

這樣子 cin 在讀取失敗時(強制中斷、讀到檔案尾端等等),會回傳一個布林變數 false。此時便會跳出迴圈。

 

 

以上,希望有幫到您。

 
ZeroJudge Forum