【问题标题】:Converting array of char pointers to void pointer and then converting back将 char 指针数组转换为 void 指针,然后再转换回来
【发布时间】:2014-03-02 11:57:34
【问题描述】:

我必须将一组标记传递给处理线程创建的函数。为此,我使用了函数可以采用额外的 void *aux 参数这一事实。

函数(只有最后一个参数与我的问题相关):

tid_t
thread_create (const char *name, int priority,
               thread_func *function, void *aux);

我使用这个数组来存储指向字符串标记的指针:

 char *argv[];

这就是我传递参数的方式(最后一个是相关的):

 thread_create (file_name, PRI_DEFAULT, start_process, argv);

但是,当我尝试转换回来时

char *argv[] = aux;

我收到以下消息:

error: invalid initialiser

有没有办法通过 void 参数传递字符串指针数组?

【问题讨论】:

    标签: c arrays pointers initialization


    【解决方案1】:

    您正在尝试分配给可变长度数组:

    char *argv[] = aux; /* wont compile! */
    

    改为将变量声明为char**

    char **argv = aux;
    

    【讨论】:

    • 您可能想修改您的答案,以便我撤消我的反对意见。
    • 但是,不需要强制转换为char **
    • 完成。我觉得你应该得到代表,因为你指出了正确的答案。谢谢大家:)
    • @alk 如果您的意思是 您的 char *argv[] = {aux} 的初始提案,您说得非常正确,这是错误的。 MBlanc 最初唯一错误的是不必要的演员阵容。 (他的 VLA 语言无法承受,这是完全不同的)
    【解决方案2】:

    数组在传递给函数时会衰减为指针,所以只需这样做:

    char ** argv = aux;
    

    要获得aux 引用的数组的副本,请执行以下操作:

    char ** ppc = aux;
    while (*ppc)
    {
      ++ppc;
    }
    
    char * argv[ppc - ((char **) aux) + 1] = {NULL};
    while (ppc > ((char **) aux)
    {
      argv[ppc - ((char **) aux) - 1] = *ppc;
      --ppc;
    }
    

    上述解决方案需要 VLA,可从 C99 上获得。

    【讨论】:

    • 我觉得这段代码太难理解了。为什么不使用memcpy
    • 是的,第二个循环可以替换为简单的memcpy()。 @MBlanc 然而,第一个是确定元素数量所必需的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2011-10-27
    • 2017-02-12
    • 2012-11-21
    • 2021-09-20
    • 2016-01-12
    相关资源
    最近更新 更多