Я понимаю, что при увеличении i p [i] будет содержать указатель на выделенную память, называемую malloc
Так что, если вы понимаете это, когда это означает, что p[i]
существоэлемент массива имеет тип char *
, потому что, по крайней мере, в программе есть явное приведение к этому типу вызова malloc
в операторе if
if ((p[i] = (char *)malloc(nbytes)) == NULL){
Так что это объявление
char *p[PTRS];
объявляет массив PTRS
элементов с tyoe char *
. Я советую написать такие объявления, как
char * p[PTRS];
, вставляя пробел после символа '*'
.
Вы можете переписать объявление также следующим образом
char * ( p[PTRS] );
Указатель на массив PTRS
элементов типа char
объявляется следующим образом.
char ( *p )[PTRS];
Можем ли мы освободить указатель NULL?
Точнее было бы сказано, можем ли мы использовать функцию free
с нулевым указателем, потому что мы не освобождаем сам нулевой указатель, который в контексте вашего примера имеет автоматическую продолжительность хранения.
Ответда, мы можем. Вызов функции с нулевым указателем не окажет никакого влияния и безопасен.
Таким образом, этот цикл
for (i=0; i<PTRS; i++){
if(p[i]){
free(p[i]);
p[i] = NULL;
}
}
может быть переписан как
for (i=0; i<PTRS; i++){
free(p[i]);
p[i] = NULL;
}