0

私は助けが必要です、私はちょうどCを学んでいます、何が悪いのかわかりません:

ここで関数を呼び出しset_optsます:

char * tmploc ;
tmploc=set_opts("windir","\\temp.rte");
printf(tmploc);

( printf はフォーマットされていないことを知っています。テスト目的で使用しただけです)

関数は次のようになります。

char * set_opts(char * env,char * path){
    char * opt;
    opt=malloc(strlen(env)+strlen(path)+1);
    strcpy(opt,getenv(env));
    strcat(opt,path);
    return opt;
}

すべて問題ありませんが、もう一度呼び出そうとすると:

char * tmploc2 ;
tmploc2=set_opts("windir","\\temp.rte");
printf(tmploc2);

...プログラムはちょうど終了します

私が間違っていることを教えてください

4

5 に答える 5

6

を使用して文字列の長さを割り当てますenvが、その後に を入力しgetenv(env)ます。getenv(env)それよりも長い場合はenv、segfault の可能性が高くなります。使うつもりだったのstrlen(getenv(env))

コードにエラー チェックを追加する必要があります。

char *set_opts(char *env, char *path)
{
    char *opt;
    char *value;

    value = getenv(env);
    if (value == NULL)
      ... handle error
    opt = malloc(strlen(value)+strlen(path)+1);
    if (opt == NULL)
      ... handle error
    strcpy(opt,value);
    strcat(opt,path);
    return opt;
}
于 2013-03-25T20:27:15.803 に答える
4

getenv()次の理由により、を使用していることに注意してください。

getenv() 関数は、環境内の値へのポインターを返すか、一致がない場合は NULL を返します。

したがって、既存の環境変数に対応しない名前を渡すと、NULL が返され、それはあなたのstrcpy(opt,getenv(env));

私はお勧めします:

  1. malloc()が返されるかを確認し、null でないことを確認してください。
  2. getenv()が返されるかを確認し、null でないことを確認してください。
  3. ご指摘のとおり、printf でフォーマット文字列を使用し、-Wall.
  4. デバッガーを使用してコードをステップ実行し、出力が表示される前にコードが終了しないことを確認します。
于 2013-03-25T20:25:45.940 に答える
0

を取り除いてみてくださいgetenv(env)。置くだけstrcpy(opt,env);getenv()おそらく戻ってきてNULLいます。

于 2013-03-25T20:27:47.790 に答える
0

考えられる理由の 1 つは、malloc が返さNULLれ、それをチェックしないことです。getenv() も同様です。そして、そうでなければならない

 malloc(strlen(getenv(env))+strlen(path)+1);

getenv("windir") の実際の内容が 6 文字を超える場合、未定義の動作を引き起こす、malloced バッファーを超えて書き込みます。

于 2013-03-25T20:24:43.780 に答える
0

本当に: getenv(env) は "opt" に収まりますか? 私はそうは思わない。適合しない場合、strcpy はプログラムを強制終了する可能性があります。

訂正: char * set_opts(char * env,char * path){ char * opt; char * 値 = getenv(env); opt=malloc(strlen(値)+strlen(パス)+1); strcpy(選択、値); strcat(選択、パス); オプトを返します。}

このように、十分なスペースがあることを確認してください。

于 2013-03-25T20:33:43.850 に答える