从函数中的 argv 分配指针

assign pointer from argv in function

我正在尝试从程序 **argv 中正确分配一个指针。当我在主函数中分配 data 时它工作正常,但是当我试图将该逻辑放入一个单独的函数时它却没有。

我做错了什么?

void parse_args(char *argv[ ], unsigned char *data, *data_len,  *nprocs){

    data = (unsigned char *)argv[1];
    *data_len = strlen(argv[1]);
    *nprocs = atoi(argv[2]);
}

int main(int argc, char **argv) {
    unsigned char *data;
    int  data_len;
    int   nprocs; 

    // this doesnt work (for data)
    parse_args(argv, data, &data_len, &nprocs)

    // this works (for data)
    data = (unsigned char *)argv[1];
}

这一行

data = (unsigned char *)argv[1];

修改main的本地data的本地副本,因为所有参数,包括指针,都是按值传递的。如果你想在 main 中修改 data,通过指针传递它(即你现在需要一个指向指针的指针):

void parse_args(char *argv[ ], unsigned char **data_ptr, int *nprocs) {
    ...
    *(data_ptr) = (unsigned char *)argv[1];
    ...
}

您的函数需要传递 char * [](相当于参数规范中的 char**)。你不应该在调用函数时指定类型,这应该会给你一个编译器错误(char * 不在这里使用!)

// this doesnt work (for data)
parse_args(char *argv, data, &data_len)

必须替换为

parse_args(argv, data, &data_len)

因此,接下来,您传递一个指针 data ,但是您按值传递该指针,即您的 parse_args 获得该指针的一个很好的副本(从技术上讲,它只是一个地址存储在变量中),然后修改该副本。你可能想像 data_len:

一样传递它
void parse_args(char *argv[ ], unsigned char **data, *data_len,  *nprocs){
..
parse_args(argv, &data, &data_len, &nprocs)

总而言之,这似乎不是一个很好的参数解析尝试。有很多库可以为你做这件事,如果你想保持老派,我建议使用 gengetopt,它会生成你需要的所有解析代码,并有很好的文档。