从函数中的 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
,它会生成你需要的所有解析代码,并有很好的文档。