Сигнатура функции 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);
Как насчет использования '(char * []) list_pointers' ?? –
Я могу просто перечислить список? – user1561108
Я не понимаю, почему это не сработает. Просто попробуйте ... –