2012-06-28 78 views
1

我有一段非常簡單的代碼,它從文件中讀取字符。如果指數y從低到高迭代,則一切正常。但是,如果它從高到低(註釋行)迭代,它會給我seg故障問題。有人能解釋爲什麼發生這種情況?謝謝!如果索引反向迭代,分段錯誤(核心轉儲)

void read_ct_from_file(unsigned char** ct, const size_t row, const size_t column, FILE* inf) { 
    size_t x, y; 
    for(x = 0; x < row; x++) { 
     for(y = 0; y < column; y++) { 
     //for(y = column - 1; y >= 0; y--) { // iterate from high to low 

       fscanf(inf, "%02x", &ct[x][y]); 
       printf("%02x ", ct[x][y]); 
     } 
     printf("\n"); 
    } 
} 

回答

3

size_t無符號,因此你的循環會後y = 0繼續max_unsigned這是> = 0

+0

我不太明白你的解釋,請你解釋一下?所以循環會在y = 0之後繼續?它會去y = -1? – drdot

+0

不,不是-1; size_t是一個無符號整數,因此從不消極。在y = 0之後,y是2^32-1 – Stefan

+0

爲了理解Stefan的評論,您必須瞭解[overflow](http://en.wikipedia.org/wiki/Integer_overflow)。使用無符號整數,當您的值小於0時會溢出。 – RustyTheBoyRobot

-1
for(y = column - 1; y > 0; y--) { // iterate from high to low 

嘗試與此有關。

+1

什麼時候索引y是0?這是數組中的最後一個元素。 – drdot

+0

它們可能意味着'for(y = column; y> 0; y--)...'然後在所有地方都使用'y - 1'。 – hroptatyr

0

BTW一個好辦法,既具有無符號的size_t指數避免環繞下溢是這樣的結構:

void read_ct_from_file(unsigned char** ct, const size_t row, const size_t column, FILE* inf) { 
    size_t x, y; 
    for(x = 0; x < row; x++) { 
     for (y = column; y-- > 0;) { // iterate from high to low 

       fscanf(inf, "%02x", &ct[x][y]); 
       printf("%02x ", ct[x][y]); 
     } 
     printf("\n"); 
    } 
} 
+0

我已經接受了一個答案。但非常感謝你的新提示! – drdot