0

Linux マシンで絶対パスをテストして、特定の引数で実行できるようにプログラムの場所を見つけようとしています。問題は、それを見つけたときに、動的に割り当てられたメモリを解放することにより、正しいパスに文字列を追加し続けることと、メモリ リークが発生することです。スタック ダンプの唯一の修正は、free(ret) しないことです。「ls」を使用して例を実行すると、プログラムが検出されて実行されますが、奇妙な結果が得られると gdb に基づいていると思います。

  for(j = 0; j < i; j++, path = NULL)
  {
  token = strtok_r(path, delim, &saver);
  if(token == NULL)
    break;
  else
    {
      strncat(ret, token, 80);
      strncat(ret, "/", 1);
      strncat(ret, command, 80);
      args[0] = ret;
      printf("%s\n", ret);
      m = execv(ret, args);
      printf("%d\n", m);
      if(m < 0)
        {
          free(ret);
          ret = malloc(120*sizeof(char));
        }
      else
      break;
    }
}

区切り文字はコロン (:) で、strncat は正しく行われていると思います。よくわかりませんが、助けてくれてありがとう。

4

1 に答える 1

0

毎回、初期化さmalloc()れていない新しいメモリを取得します。で NUL 文字を見つけようとするため、セグメンテーション違反が発生ます。strncat()retret

に置き換えるか、mallocを呼び出した後にcalloc使用します。または、どうにかして最初の の前にゼロを埋めます。memset(ret, 0, 120*sizeof(char));mallocretstrncat

解放しなくても壊れない理由は、スタックで宣言されていることが原因である可能性があります。解放/mallocしないでください。または、 の初期値がすべてゼロであるということも起こり得ますが、その後の呼び出しでは初期化されていないメモリが生成されます。retretmalloc

PS: を使用してもexecvよろしいですか? これにより、現在のプロセスが置き換えられます。しかし、私はあなたがフォークすると仮定します。

于 2011-09-27T01:35:27.170 に答える