2017-04-04 11 views
1

私は文字列を逆にしようとしていますが、私のプログラムはコンパイルを行い、 、私はエラーが何を意味するかを理解し、それから来るのどこ私は理解していない:なぜ私はセグメンテーションフォールトを取得していますセグメンテーションフォールト(コアダンプ)を取得していない理由を理解していない

#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

関連する問題