Подтвердить что ты не робот

Разница между malloc и realloc?

Предположим, у меня есть два примера кода для создания целочисленного массива из 10 элементов:

int *pi = (int*)0; 
realloc(pi,10);

а другой - это тот, который написан нормально, т.е.

int *pi;
pi= malloc(10*sizeof(int));

Теперь мой вопрос: первый тип назначения является законным, но не используется. Почему, хотя там я могу получить начальное местоположение по своему выбору?
Инициализация указателей с константами допустима, но не используется. Почему?

4b9b3361

Ответ 1

Когда передается NULL, realloc эквивалентно malloc. Вызов NULL может быть полезен, если вы перераспределяете в каком-то цикле и не хотите иметь особый случай при первом выделении.


Пока мы на этом, достаточно стандартные способы использования malloc и realloc:

int* p;
p = malloc(10 * sizeof(int)); //Note that there no cast
//(also, it could just be int* p = malloc(...);)

int* np = realloc(p, 15 * sizeof(int));
//Note that you keep the old pointer -- this is in case the realloc fails

В стороне от тангенциальности: история - это главная причина, по которой вы видите объявления и назначения в разных строках. В старых версиях C объявления должны были стоять первыми в функциях. Это означало, что даже если ваша функция не использовала переменную до 20 строк, вы должны были объявить сверху.

Поскольку вы, как правило, не знаете, каким должно быть значение переменной, не используемой для других 20 строк, вы не всегда можете инициализировать ее чем-то значимым, и, таким образом, у вас останется объявление и никакое присваивание в верхней части функция.

В C99/C11 вам не нужно объявлять переменные в верхней части области. На самом деле, обычно предлагается определять переменные как можно ближе к их использованию.

Ответ 2

C требует, чтобы указатель, переданный в realloc, должен быть указателем, полученным из вызова функции malloc, calloc или realloc (или нулевого указателя).

Ответ 3

Первое назначение не является законным, потому что указатель, который вы передаете в realloc(), должен был быть ранее предоставлен вам через какое-либо выделение. (Кроме того, вы игнорируете его возвращаемое значение, то, что вы никогда не должны делать с выделениями!)

malloc() - создать буфер для чего-то определенного фиксированного размера. realloc() - вернуть один буфер и получить другой (предположительно) другой размер - и он может вернуть вам тот же самый буфер, который вы использовали.