在函数中从argv分配指针

时间:2015-03-26 08:37:45

标签: c arrays pointers argv

我正在尝试从程序**argv中正确分配指针。当我在main函数中指定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];
}

2 个答案:

答案 0 :(得分:2)

这一行

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

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

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

答案 1 :(得分: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,它会生成你需要的所有解析代码并且有很好的文档。