2017-04-04 20 views
1

我想要反轉一個字符串,我的程序將編譯並做所有它應該做的事情,但是,當我運行應用程序時,我得到Segmentation fault (core dumped) ,我明白什麼錯誤意味着,但我不明白的地方它是從未來:獲取分段錯誤(核心轉儲),並不明白爲什麼

#include <stdio.h> 
#include <string.h> 

char *reverse(char *str) 
{ 
    char tmp, *src, *dst; 
    size_t len; 

    if (str != NULL) 
    { 
     len = strlen(str); 
     if (len > 1) 
     { 
      src = str; 
      dst = src + len - 1; 

      while (src < dst) 
      { 
       tmp = *src; 
       *src++ = *dst; 
       *dst++ = tmp; 
      } 
     } 
    } 
    return str; 
} 

int main(int argc, char *argv[]) 
{ 
    char *str[] = {"a", "ab", "abc", "test", "another test"}; 
    int i; 
    char s[10000]; 
    for (i=0; i < sizeof(str)/sizeof(str[0]); i++) 
    { 
     strcpy (s, str[i]); 
     printf("Original: %s", str[i]); 
     printf("Reversed: %s", reverse(s)); 
    } 
    return 0; 
} 

爲什麼會出現分段錯誤,我怎麼能解決這個問題?

+1

通過使用調試器來找出*,其中*崩潰發生在你的代碼開始。然後檢查所有涉及變量的值。如果你仍然無法自己弄清楚,那麼請編輯你的問題,告訴我們*這些細節。 –

+2

它的時間使用調試器。對於這個小程序來說,它不會有任何困難。如果您有關於崩潰轉儲更新細節的任何具體問題。 –

+1

你的算法有點不對。 –

回答

6

問題是您的srcdst指針正在朝相同的方向移動,因此src從未「捕獲」dst。最終指針超過允許的內存區域,導致未定義的行爲,從而導致分段錯誤。

你需要遞減dst而不是遞增它:

while (src < dst) 
{ 
    tmp = *src; 
    *src++ = *dst; 
    *dst-- = tmp; 
} // ^^ 

Demo.

+0

Awh,這很有道理,謝謝 – jakehimton