execv
函数将一个指针数组作为第二个参数。我有一个指向指针的指针,一个动态创建的字符串列表。
如何从中创建指针数组?
char **list = malloc((argc)*sizeof(char*));
int i=0;
for(i=0;i<argc;++i){ // using argv for example...
list[i] = malloc(strlen(argv[i])+1);
strcpy(list[i], argv[i]);
}
// create from list an array of pointers
execv(list_pointers[0], list_pointers);
如果只是将list
传递给execv
,我会收到错误地址错误。
答案 0 :(得分:1)
来自execv手册页:
&#34;指针数组必须用NULL指针终止。&#34;
函数execv不知道参数计数
char **list = malloc((argc+1)*sizeof(char*));
if (list == NULL) {
abort();
}
int i;
for(i=0;i<argc;++i){ // using argv for example...
if ((list[i] = strdup(argv[i])) == NULL) {
abort();
}
}
list[argc] = NULL;
execv(list[0], list);
EDIT 我还从execv调用中删除了list + 1,感谢@ajay找到它
答案 1 :(得分:1)
标题execv
中声明的函数unistd.h
的签名是
int execv(const char *path, char *const argv[]);
请注意,这与
相同int execv(const char *path, char *const *argv);
表示argv
是指向char * const
类型对象的指针,即指向字符的常量指针。另外,execv
的手册页说 -
按照惯例,第一个参数应该指向文件名 与正在执行的文件相关联。指针数组必须 被NULL指针终止。
此外,list
的类型为char **
,与execv
的第二个参数兼容。我建议进行以下更改 -
// +1 for the terminating NULL pointer required for the
// second argument of execv
char **list = malloc((argc + 1) * sizeof *list);
if(list == NULL) {
printf("not enough memory to allocate\n");
// handle it
}
int i = 0;
for(i = 0; i < argc; ++i) {
// strdup returns a pointer to a new string
// which is a duplicate of the string argv[i]
// this does effectively the same as the commented
// out block after the below statement.
// include the header string.h for the prototype
// of strdup POSIX function.
list[i] = strdup(argv[i]);
/*
list[i] = malloc(strlen(argv[i])+1);
if(list[i] == NULL) {
printf("not enough memory to allocate\n");
// handle it
}
strcpy(list[i], argv[i]);
*/
}
list[argc] = NULL; // terminate the array with the NULL pointer
execv(list[0], list);