Проверка кода:
char **p; // Declared, but uninitialized
p[0] = "test"; // Setting value to it?
p
неинициализирована, и поэтому попытка доступа и установки памяти с ее помощью является UB или неопределенным поведением.Неудача намного лучше, чем потенциальные альтернативы.
Для второго фрагмента кода предполагается, что размер - это некоторый указатель, не включенный во фрагмент.
char** array
array = realloc(array, sizeof(char*)*((*size)+1)); // Allocating.
array[*size] = (char*)malloc(sizeof(char)*(strlen(input)+1));
Таким образом, строго говоря, вызов realloc с неинициализированным указателем является UB, случайно массив равен Null
.
Обратите внимание, что:
Если ptr равен NULL, поведение аналогично вызову malloc (new_size).
Таким образом, realloc выделит кусок памяти и передаст его массиву.
Затем вы разыменовываете указатель (который больше не указывает на Null
, а является допустимым местом в памяти), и размещаете его, что не дает сбоя.
Исходя из наилучшего предположения, хотя это неопределенное поведение, p в обоих случаях, возможно, равно Null
, и первый сбой при попытке разыменования, а второй успешно получает неправильный доступ.