2012-06-21 112 views
3

我想打個顛倒字符串函數,我已經做了這樣的:爲什麼這個反向串函數給出了seg錯誤?

void reverse_str(char s[]) { 
    int i, j; 
    char ch; 
    for(i = 0, j = strlen(s) - 1; i < j; i++, j--) { 
     ch = s[i]; 
     s[i] = s[j]; 
     s[j] = ch; 
    } 
    return ; 
} 

但由於某些原因,當我改變i < ji != j我得到一個分段錯誤。這也發生在ij是指針。爲什麼?

回答

7

這幾乎肯定是因爲ij相互傳遞(無論它們是索引還是指針在這裏都不相關)。例如,任何字符數爲偶數的字符串都會遇到這個問題。

考慮以下序列的字符串drum

<- indexes 
    ---- 
s = "drum", i = 0, j = 3, swap d and m. 
s = "mrud", i = 1, j = 2, swap r and u. 
s = "murd", i = 2, j = 1, swap u and r, oops, we've passed each other. 
s = "mrud", i = 3, j = 0, swap m and d. 
s = "drum", i = 4, j = -1, swap who knows what, undefined behaviour. 

注意,對於奇數長度的字符串,你不會有這樣的問題,因爲i最終等於j(在中間字符)。

i < j檢查也修復了這個問題,因爲它檢測到指針相互傳遞的指針的相等。

+0

非常感謝您! – Gtiou

3

如果j以奇數開頭(當s的字符數爲偶數時),那麼i和j永遠不會相等 - 所以循環將繼續超出數組的範圍s

例如,如果i = 0j = 1第一評價時,則下一個循環將有i = 1j = 0(注意仍然不相等)和第三環將具有i = 2j = -1,因此錯誤。

1

你是如何調用該函數?換句話說,你確定你傳入的字符數組是可寫的嗎?

如果內存是好的,它可能當您使用!=因爲沒有保證,這種情況發生的時候,你指望它崩潰。

1

如果strlen(s) - 1是奇數,那麼你的條件i!=j將永遠是正確的。

相關問題