Первый пример верен, хотя строка
char * strings[] = { "a", "b", "c", NULL};
не используется.
#include <stdio.h>
#include <stdlib.h>
int main() {
char **xstrings = malloc(4 * sizeof *xstrings);
free(xstrings);
return 0;
}
Выше мы выделяем место для 4 char *
указателей и правильно освобождаем память.
Как правило, мы бы хотели выделить память для каждого из char *
указателей (мы не сможем достичь ничего значимого, если переменная xstrings
в конечном итоге не укажет на некоторые данные):
#include <stdio.h>
#include <stdlib.h>
int main() {
int len = 4;
char **xstrings = malloc(len * sizeof *xstrings);
for (int i = 0; i < len; i++) {
xstrings[i] = malloc(sizeof(*xstrings[i]) * some_length);
}
/* ... do something with the memory ... */
/* free each xstring element */
for (int i = 0; i < len; i++) {
free(xstrings[i]);
}
free(xstrings);
return 0;
}
Линии
while (*xstrings) {
free (*xstrings);
*xstrings++ = NULL;
}
не имеют особого смысла.Когда память free
d, она не может быть использована.Вы можете использовать временные переменные для достижения этой цели, но это будет немного болезненно по сравнению с простым использованием цикла for
(мы не хотим отказываться от исходного указателя xstrings
, поэтому мы можем его освободить позже, и мынужна временная переменная в цикле для вызова free
после перемещения указателя вперед).