2017-03-14 12 views
0

私はCにはとても新しいので、これが愚かな質問であればお詫び申し上げます。私はセグメンテーションフォルトを取得しています.GDBを実行すると、通常どおりフォルトを引き起こしていることを示す行番号が表示されません。代わりに、私はの線に沿って何かを得る:セグメント違反はどこで発生していますか?

find_any_ptrで0x00000000004012ff()

私は、与えられたstringstop内の任意の文字の最初の出現へのポインタを返すようにする方法を書いていますstringにいずれの文字も含まれていない場合はNULLとなります。

char *find_any_ptr(char *string, char* stop){ 
    char* ch1 = string; 
    char* ch2 = stop; 
    int retComp = strlen(string); 
    char* retChar; 
    while(*ch2 != '\0'){ 
     int temp = 0; 
     while(*ch1 != '\0'){ 
      if(*ch2 == *ch1){ 
       if(temp < retComp){ 
        *retChar = ch1; 
        retComp = temp; 
       } 
      } 
      temp++; 
      ch1++; 
     } 
     ch2++; 
    } 
    if(retComp == strlen(string)){ 
     return NULL; //NULL has been defined elsewhere 
    }else{ 
     return retChar; 
    } 
} 

誰かが根本的な問題がどこにあるか知っていれば、本当にありがとうございます。 :) ありがとうございました!

+3

'retChar'は初期化されていないポインタなので、クラッシュは' * retChar = ch1'で発生します。コマンドラインで '-Wall'を使ってコンパイルすると、コンパイラはこのようなことについてあなたに伝えるべきです。 (あなたはおそらく 'retChar = ch1'と書くことになる) –

+0

クラッシュのほかに、アルゴリズムを逆向きにしているように見えます。外側のループは' string'の文字に、内側のループは 'stop'の上になければなりません。これらの一時変数をすべて必要とするわけではありません。マッチした文字を最初に見つけたら、すぐに 'string'のどこにポインタを戻すことができます。ループの終わりになると、何も見つからないことを意味するので、NULLを返す必要があります。 –

+0

gdbを実行する前に-gフラグを付けてコンパイルしていますか? –

答えて

1

*retChar = ch1;からretChar = ch1;に変更します。 retCharポインターが何かに初期化されていないときに逆参照しているだけで、おそらくポインタにch1ポインターの値(ポインターが指していないアドレス)を割り当てたいと思っています。

0

次の文:あなたが初期化されていないポインタを参照解除しようとしているので

*retChar = ch1; 

は、セグメンテーションフォルトが発生します。これを避けるために、あなたはその文に変更する必要があります。

retChar = ch1; 

このステートメント店舗retCharch1のアドレスではなく、ch1に格納されchar値を、これはおそらくあなたが探しているものです。

+0

あなたが提案している ''新しいchar 'は、メモリをリークする以外の目的はありません。 –

+0

@MatteoItaliaちょうど私のポストを編集しました、申し訳ありません、私はそれに気付かなかった。それを指摘してくれてありがとう! –

関連する問題