2

我似乎无法让它工作。wordexp()当我这样称呼它时,效果非常好:

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

但是我想传入一些用户将输入的值,然后从中获取argvand 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将 args 转换为另一个字符串。但仍然得到错误。一定很傻(或者不能用wordexp做到这一点)?

4

4 回答 4

5

我怀疑你的问题是

函数 wordfree() 再次释放分配的内存。更准确地说,它不会释放它的参数,而是释放数组 we_wordv 和指向的字符串。

所以你返回一个指向freed 内存的指针,当你访问它时,分段错误并不少见。

于 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 回答