указатель инициаций на массивы - PullRequest
0 голосов
/ 07 февраля 2019
    //1
    char** p;
    p[0]="Test";

    //2
    char** array;
    array = realloc(array, sizeof(char*)*((*size)+1));
    array[*size] = (char*)malloc(sizeof(char)*(strlen(input)+1));

Почему первый код дает сбой во второй строке, а второй код работает нормально, разве array[*size] не похож на p[0]?

1 Ответ

0 голосов
/ 07 февраля 2019

Проверка кода:

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, и первый сбой при попытке разыменования, а второй успешно получает неправильный доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...