2016-10-11 7 views
-1

以下の関数は、最初の2番目の文字列のすべての大文字に変更する必要があります。 最初の文字と一致する場合は、最初の文字列の位置にpを指定してから、一致文字列の残りの部分を確認する必要があります。一致した場合は、すべての文字を大文字に置き換えます。 pポイントの値にアクセスしようとすると「セグメンテーションフォールト」が発生する このプログラムには多くの問題があることがわかります。最初の文字の位置をiに格納し、i + jをインデックスとして使用できます最初の文字列の場合。また、2番目の文字列に文字のみが含まれているかどうかを確認しません。 とにかく、より良いバージョンを書き直すことができたとしても、この特定のケースでポインタの使用に何が問題なのかを本当に知りたいです。Cのセグメンテーション・フォルト、理由を特定できない

char *matchToUp(char *s, char *match) 
{ 
    int i = 0, j=0; 
    char *p = s; 

    while (s[i] != '\0') 
    { 
     while(s[i]!= match[0] && s[i]!= '\0') 
     { 

      i++; 
     } 
     printf("%d", i); 
     p = &s[i]; 
     while (match[j] != '\0' &&p[j] == match[j]) 
     { 
      j++; 
     } 
     if(match[j] == '\0') 
     { 
      printf("%d", j); 
      while(j >= 0) 
      { 
       p[j] = (char) toupper((unsigned int) p[j]); 
       j--; 
       i++; 

      } 
     } 
     else 
     { 
      j=0; 
      i++; 

     } 
    } 


    return s; 
} 
+0

問題の原因は呼び出し元にあります(この関数でも、渡されたデータの健全性チェックではありません)。 –

+1

valgrindおよび/またはgdbで実行し、取得した内容を確認します。 –

+0

char * p; p = matchToUp( "abcde"、 "abc"); データを正当にチェックする必要がありますが、確かに "de"を追加しました。問題はアドレスが範囲外であるという事実ではありません。 私はCode :: Blocksを使用します。イデア? – MatSiv97

答えて

0

あなたは最初の呼び出し試合後の1であなたのコードのP [j]をポイントして、のTOUPPERのもの一つの要素をやって起動。

+0

はい、それは本当ですが、p> jにアクセスする前にj> 0でjを減らして修正しましたが、まだ動作しません。 – MatSiv97

1

機能(またはプロセス)がバインドされていないメモリにアクセスしようとすると、セグメンテーションフォルトが発生します。 この場合、関数にポインタを渡しているようです(*s)。呼び出し元がmallocを使用してヒープ上のその文字列のスペースを割り当てていない場合、変数はデフォルトで呼び出し元関数のstackにあります。 各機能は独自のstack frameを取得し、スタックフレーム外のメモリにアクセスするとsegmentation faultが発生します。したがって、​​をこの関数に渡すときは、あなたのスタックフレームの一部ではないchar配列へのポインタを渡す(潜在的には、呼び出し側に確認する必要があります:))。したがって、アドレスs*[j]にアクセスしようとしているためにsegmentation faultが表示されていますが、この機能にはアクセスできません。

+0

引数として文字列リテラルを渡し、メモリを割り当てずに修正しようとしました。 – MatSiv97

+0

ああええ、あまりにもそれを行うだろう:) –

関連する問題