Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将命令行参数传递给线程函数_C_Multithreading_Casting - Fatal编程技术网

C 如何将命令行参数传递给线程函数

C 如何将命令行参数传递给线程函数,c,multithreading,casting,C,Multithreading,Casting,我有一个线程函数,我正在尝试传递它argv,但没有成功。有什么帮助吗 int main(int argc, char** argv){ pthread_create(&p, NULL, fn, (void *)&argv); } void* fn(void *param){ // How to cast here, so I will be able to use it as param[0], param[1] etc. } 你想看什么就看什么 void*

我有一个线程函数,我正在尝试传递它
argv
,但没有成功。有什么帮助吗

int main(int argc, char** argv){
    pthread_create(&p, NULL, fn, (void *)&argv);
}

void* fn(void *param){
    // How to cast here, so I will be able to use it as param[0], param[1] etc.
}

你想看什么就看什么

void* fn(void *param){
    char** argv = *(char***)param;
}
或者更简单地说

int main(int argc, char** argv){
    pthread_create(&p, NULL, fn, argv); 
}

void* fn(void *param){
    char **argv = param;
}

由于
argv
是指针,您可以通过将其转换为
void*
并再次转换为原始类型来获得与原始值相同的值。

命令行参数有两部分:

  • argc
    -参数的数量,以及
  • argv
    -包含实际参数的数组
由于只能将一个“用户数据”参数传递给
pthread\u create
,因此需要将这两个值打包到一个结构中,然后将结构的地址作为用户数据传递

typedef struct ArgCV {
    int argc;
    char **argv;
};

int main(int argc, char **argv) {
    ArgCV args;
    args.argc = argc;
    args.argv = argv;
    pthread_create(&p, NULL, fn, &args);
    ...

void* fn(void* param) {
    ArgCV *args = (ArgCV*) param;

    for(int i=0; i<args->argc; i++) 
       printf("%s\n", args->argv[i]);
    ...

您需要将
argc
argv
都传递到
pthread\u create
中,但只能传递一个参数。解决方案:将两者打包到一个结构中,并传递该结构的地址。@AJNeufeld:你真的不需要
argc
,因为
argv
数组总是以空POINTER结尾…@chrisdd:哦,天哪,我的年龄到了!对规范的愚蠢改进,使程序的行为更加可预测。。。我会在下面更新我的答案。。。然后,挥舞着我的手杖,“滚开!”OP应该如何处理大小未知的数组?@SergeyA:通过查找标记数组结尾的空指针。argv[i]会返回传递的第i个命令行参数吗?还是*argv[i]?
int main(int argc, char **argv) {
    pthread_create(&p, NULL, fn, argv);
    ...

void* fn(void* param) {
    char **argv = (char**) param;

    int argc = 0;
    while(argv[argc] != NULL) {
        printf("argv[%d] = %s\n", argc, argv[argc]);
        argc++;
    }
    printf("There are %d arguments\n", argc);
    ...