2016-10-03 10 views
-2

私は以下の比較を行い、Cプログラムがあります:targetがに発生した場合セグメンテーションフォールト*比較

int find_in_args(char** args, char* target) { 
    int found = -1; 
    int i = 0; 
    while (i != 10) { 
     if (strcmp(args[i], target) != 0) 
      ++i; 
     else { 
      found = i; 
      break; 
     } 
    } 
    return found; 
} 

:そうのようなchar*の配列を

void compare(char** args) { 
    if (find_in_args(args, ">") != -1) { 
     printf("In > block"); 
    } 
    else if (find_in_args(args, "<") != -1) { 
     printf("In < block"); 
    } 
    else if (find_in_args(args, "|") != -1) { 
     printf("In | block"); 
    } 
} 

find_in_args()繰り返し処理を">"であれば、プログラムはIn > blockを出力します。 targetが "<"または "|"になると、プログラムはSegmentation fault (core dumped)を出力します。

しかし、最初に "<"ブロックを移動すると、プログラムはIn < blockを出力し、targetが ">"または "|"の場合はセグメント化エラーが発生します。

char*配列を反復処理がstrcmp()を使用していることを比較が唯一たらを発生する可能性があることが表示されます。私はfind_in_argsの各呼び出しのためにargsのコピーを作ろうとしましたが、コピーで比較を実行しましたが、同じ問題が発生します。

なぜ私は比較関数を一度しか呼び出せないのですか?それでは、どのようにしてセグメンテーションフォルトを取得せずにn回比較関数を呼び出すことができるのですか?

+0

あなたは引数を割り当てるコードを含めることができargs初期化/割り当てていることを確認してください? –

+0

起動する前にargsを出力してください。 –

答えて

0

この問題は、whileループ内のi != 10によって発生します。 args[i] != NULLに基づいてループを変更してwhileループを変更すると、問題が解決されます。とりわけ

+1

'args [i]!= NULL'はあなたの問題を解決できないかもしれません。 – Mohan

0

、このコードセクションは、セグメンテーションフォールトにバインドされています

while (i != 10) { 
    if (strcmp(args[i], target) != 0) 
     ++i; 

あなたはあなたの関数compareを呼び出す方法を指定していないが、それはあなたのargsがを指すように適切に割り当てられていない可能性が高いに見えますcharへの10個のポインタ。だからwhileループの中でiを増やすと、無効な/違法な場所を指しているので、segfaultを指します。

ヒント:

  • 10は、あなたのプログラムであるものを定義します。
  • comparefind_in_argsの関数には、argsが指し示すと思われるcharへのポインタの数を示す追加のパラメータがあります。
  • 適切