2014-03-02 191 views
0

我必须将一个标记数组传递给处理线程创建的函数。为此我使用这个函数可以采用额外的void *aux参数。将char指针的数组转换为void指针,然后转换回

的功能(仅最后一个参数是有关我的问题):

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 

是否有合格的字符串指针数组通过无效参数的方法吗?

回答

2

你想分配给一个可变长度的数组:

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

相反,变量声明为一个char**

char **argv = aux; 
+0

你可能喜欢触摸你的答案,所以我可以撤销我的downvote。 – alk

+1

但是,转换为'char **'不是必需的。 – alk

+0

完成。我觉得自从你指出正确答案之后,你应该得到代表。感谢所有:) – MBlanc

1

被传递到当一个数组衰变为指针一个函数,所以只需要:

char ** argv = aux; 

要有一个数组引用的副本d由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; 
} 

上述这种解决方案需要VLAS,上可用形式C99。

+0

我觉得这个代码太难以遵循。为什么不使用'memcpy'? – MBlanc

+0

是的,第二个循环可以用一个简单的'memcpy()'代替。 @MBlanc然而,首先要确定元素的数量。 – alk

相关问题