我正在尝试从程序**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];
}
答案 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
,它会生成你需要的所有解析代码并且有很好的文档。