/ / Как да конвертирам char ** в char * [] в c? - c, указатели, c-низове, execv

Как да конвертирам char ** в char * [] в c? - c, указатели, c-низове, execv

Най- 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 за намирането му