realloc
идет только на один уровень глубиной. Он даже не знает, что вы передаете ему указатель на указатель, поскольку его аргумент преобразуется в void*
, его тип параметра. Что касается malloc
, realloc
и free
, память - это просто массив байтов. Если вы храните указатели в памяти, это ваш выбор, но malloc
не волнует.
Тем не менее, утечка памяти не происходит до free(p1)
, которая также не попадает в массив указателей. (realloc
все равно будет копировать указатели, хранящиеся в буфере, если блок будет увеличен. Когда он уменьшен, у вас проблемы.)
Кроме того, поведение вашей программы не определено, поскольку вы не проверяете ошибки, а следующее работает только тогда, когда sizeof(char *) < 10
:
p1 = (char **) malloc ( 100 );
for ( i = 0; i < 10; i ++ )
{
p1[i] = (char *) malloc(10);
memcpy ( p1[i], "1234567890", 10 );
}