【问题标题】:c: wordexp for variable passed inc:传入变量的wordexp
【发布时间】:2012-09-10 05:04:17
【问题描述】:

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

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

但是我想传入一些用户将输入的值,然后从中获取argvargc。现在我有以下代码,但我总是收到“分段错误”或“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 做到这一点)?

【问题讨论】:

  • 你大概使用*argc = p.we_wordc;?否则,您的编译器应该会向您抱怨。

标签: c++ c parsing arguments


【解决方案1】:

您只能直接从 main() 访问 argv[] 和 argc。从那里您可以将它们传递给其他函数。

int main(int argc, char * argv[])
{
    char ** parsed = parseCommand(argc, argv);
    return 0;
}

【讨论】:

    【解决方案2】:

    我怀疑你的问题是

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

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

    【讨论】:

      【解决方案3】:

      感谢您的回答。但是,看起来错误是因为它传递了一个带有换行符的字符串,但它不喜欢这样。从字符串中删除换行符后似乎现在可以工作了。

      【讨论】:

        【解决方案4】:

        从我的角度来看,如果将 p.we_wordv 分配给“w”,然后销毁“p”对象/结构,则整个内容(内部的字段 - we_wordv)也会被销毁,这意味着“w”指向一些随机数据,它取决于编译器,或者当前运行时的情况,如果它们仍然有效。

        您应该使用 malloc 为 p 分配内存,然后复制内容并返回指针。

        【讨论】:

          猜你喜欢
          • 2021-04-25
          • 1970-01-01
          • 2011-04-15
          • 2016-06-10
          • 1970-01-01
          • 2017-05-22
          • 2019-06-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多