2016-04-03 16 views
0

私はCに比較的新しいだと私は次のように問題がある:私はこれを実行するとRegexc - セグメンテーションフォールト

regex_t re; 
regmatch_t matches[2]; 
int start; 
int end; 
int count = 0; 

int reti = regcomp(&re, "^(?:[a-zA-Z]|[a-zA-Z](?:[a-zA-Z0-9\\-])*[a-zA-Z0-9])(?:\\.(?:[a-zA-Z]|[a-zA-Z](?:[a-zA-Z0-9\\-])*[a-zA-Z0-9]))*$", REG_EXTENDED); 

while (1) { 

    printf("Local = %s\n", local); 
    reti = regexec(&re, local, 2, matches, 0); 

    // More code here 

} 

、私はsegmentation faultを取得します。

localは、char *localと定義され、正しく出力されています。

私はGDBを使用してコードを実行し、それが問題はラインで発生さ判明:

reti = regexec(&re, local, 2, matches, 0); 

私は理由を把握するように見えることはできません。

これはgdbから出力されます:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7af8d42 in regexec() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) backtrace 
#0 0x00007ffff7af8d42 in regexec() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x000000000040092d in email_in (str=0x400aa8 "[email protected]") attestdriver.c:70 
#2 0x0000000000400780 in main() at testdriver.c:15 

、誰もが問題になるかもしれないものについてどのような考えを持っていますか?

ありがとうございました。

+0

'regcomp()'と 'regexec()'の定義を表示できますか? –

+0

@sunqingyao https://github.com/lattera/glibc/blob/master/posix/regcomp.c#L465-L519 – Siguza

+0

'retcom'の戻り値をチェックして、' regcomp'が実際にコンパイルに成功したことを確認しましたか? – Dolda2000

答えて

1

問題は、実際にここにある:

int reti = regcomp(&re, "^(?:[a............ 

あなたはregcompをのリターンをチェックする必要があり

here:から、それはあなたの正規表現が無効であることを教えてくれます。

あなたはInvalid preceding regular expression

(?:はPOSIXの正規表現ではサポートされていないでしょう。


ので、このエラーを投げ

セグメンテーション違反を取得する一般的な方法は、

hereから)正規表現は初期化できませんNULLポインタデリファレンスにあります違法のために(?:

元のエラーは、regcompの戻り値に表示され、実行を停止しません。

+0

それはsegfaultを生成しますか? POSIX規格はそれを認めていますか? o.0 – Siguza

+0

@Siguza:コンパイルエラーでsegfaultしませんが、初期化されていない 'regex_t'が' regexec'に渡されるためです。 – Dolda2000

+0

@ Dolda2000ああ、私はスタックトレースでregcompとregexecを混同しました。感謝します、ありがとう。 – Siguza

関連する問題