2

これを機能させることができないようです。wordexp()私がそれを次のように呼ぶとき、素晴らしい働きをします:

wordexp("beep", &p, 0);
w = p.we_wordv;
argc = p.we_wordc;

argvただし、ユーザーが入力し、そこからとを取得するいくつかの値を渡したいと思いますargc。現在、次のコードがありますが、常に「セグメンテーション違反」または「EXC_BAD_ACCESS」が発生します。

char **parseCommand(char *args, int *argc) {
    printf("args %s\n", args);
    wordexp_t p;
    char **w;
    int i;
    char *beep;

    wordexp(args, &p, 0);

    w = p.we_wordv;
    argc = p.we_wordc;

    wordfree(&p);
    return w;
}

引数を出力すると、それが表示されます。strcpy別の文字列への引数も試しました。しかし、それでもエラーが発生します。ばかげたものでなければなりません(またはwordexpでこれを行うことはできません)?

4

4 に答える 4

5

あなたの問題は

関数 wordfree() は、割り当てられたメモリを再び解放します。より正確には、引数は解放しませんが、配列 we_wordv とそれを指す文字列を解放します。

そのため、d メモリへのポインターを返しますfree。それにアクセスすると、セグメンテーション違反は珍しくありません。

于 2012-09-17T23:39:01.490 に答える
1

私の見解では、p.we_wordv を「w」に割り当てた後、「p」オブジェクト/構造体を破棄すると、コンテンツ全体 (we_wordv 内のフィールド) も破棄され、「w」がランダムなデータを指すことを意味し、そのそれらがまだ有効かどうかは、コンパイラ、または現在の実行時の状況に依存します。

malloc を使用してメモリを p に割り当て、その後コンテンツをコピーしてポインターを返す必要があります。

于 2012-09-18T01:53:45.593 に答える
0

main()から直接argv[]とargcにアクセスすることしかできません。そこから、それらを他の関数に渡すことができます。

int main(int argc, char * argv[])
{
    char ** parsed = parseCommand(argc, argv);
    return 0;
}
于 2012-09-17T23:29:50.587 に答える
0

答えてくれてありがとう。ただし、改行を含む文字列を渡していたため、エラーが発生したようで、それが気に入らなかったようです。文字列から改行を削除した後、現在は機能しているようです。

于 2012-09-18T01:35:18.150 に答える