Най- 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
.
Отговори:
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 allocaten");
// 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 allocaten");
// handle it
}
strcpy(list[i], argv[i]);
*/
}
list[argc] = NULL; // terminate the array with the NULL pointer
execv(list[0], list);
1 за отговор № 2
От изпълнителната страница:
"Масивът на указателите трябва да бъде прекратен от показалец NULL."
Функцията 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);
РЕДАКТИРАНЕ Също така извадих списък + 1 от обаждането за изпълнение, благодаря за @ajay за намирането му