2012-02-01 118 views
1

當我嘗試使用函數scanf爲動態數組賦值時,第一次分配後,我會收到此錯誤「Signal received:SIGSEGV(Segmentation fault)」,但是當我使用cin時,值正確分配。爲什麼?我的代碼中存在問題嗎?C++ scanf導致SIGSEGV

int main(int argc, char** argv) { 
int r = 5; 

short* pole[r]; 


for(int x = 0;x<r;x++){ 
    pole[x] = new short[r]; 
    for(int y = 0;y<r;y++){ 
     scanf("%d",pole[x][y]); //error 
     //cin >> pole[x][y]; //OK 
    } 
} 

}

回答

4

你錯過了一個符號,和%d應該%hd(爲short int):

scanf("%hd",&pole[x][y]); 

你的原始版本傳遞pole[x][y],而scanf()需要指針。此外,類型說明符(%d)對於&pole[x][y]類型是錯誤的。

+0

哦謝謝:x我認爲這不是必要的,因爲它是數組元素 – user1145902 2012-02-01 16:03:14

+0

@ user1145902:像流版本這樣的C++用戶的原因是類型安全。編譯器會檢查您正在閱讀的內容的類型,並確保使用正確的代碼。使用格式說明符非常容易出錯(易碎)。如果你得到錯誤的類型(或者對象的類型被改變),代碼將很快破壞。 – 2012-02-01 17:56:10

0

當然,你會得到一個分段錯誤。 scanf()要求您輸入變量的指針,您正在傳遞值。

scanf("%d",&pole[x][y]); 
3

您應該使用

scanf("%d",&pole[x][y]); 

scanf()的期待一個變量的地址寫入。

另請注意,您正在使用多條短褲,但您正在讀取整數。改用%hd代替。

1

如果你想知道它爲什麼編譯,那是因爲scanf是完全非類型安全的,因爲在第一個參數之後它需要一個可變參數列表(...)。

這意味着你可以通過任何你想要的東西,它只是「希望最好」,它是你想要的。

它應該是一個指針,但它會從堆棧中滾動4或8個字節,其中的任何內容都將被視爲指針,它會嘗試從中讀取。

鑑於這是C++(你使用new而不是malloc),我建議你使用C++庫而不使用scanf。最好使用矢量而不是陣列。如果您需要矩陣,請使用矩陣類,並且您可以使用iostream或類似的方法來執行輸入數據讀取。