Использование calloc() для создания массива динамических структур utmp

Я пытаюсь создать динамический массив в C, но я немного не понимаю, как это сделать. Во-первых, calloc(), кажется, дает мне странные результаты. У меня есть следующий код:

struct utmp userRec;
printf("%d\n", sizeof(userRec)); //should print size of object
structutmp * roster = calloc(1, sizeof(userRec));
printf("%d\n", sizeof(roster)); //should print total size of all objects in array
printf("%d\n", sizeof(roster)/sizeof(roster[0])); //should print number of elements in array

Теперь результаты отпечатков:

384
8
0

Этот вывод кажется мне странным, так как первый отпечаток выглядит нормально. Если это размер этого конкретного объекта, то хорошо, но тогда я подумал, что размер списка массивов будет равен этому, поскольку calloc было сказано освободить место для одного объекта с тем же размером, что и userRec. Наконец, результат этого тоже сбивает с толку. Разве результат этого вычисления не должен быть один? Так как снова я выделил место для одной структуры utmp, то в результате должно получиться, что у меня есть место для одной структуры utmp. Не ноль. Буду признателен за любое понимание того, почему я получаю такие результаты!

Также еще один вопрос, если/когда я наконец заставлю calloc() работать на меня. Я хотел бы, чтобы этот массив мог расти! Я читал, что для этого может быть полезна функция realloc(), но я не уверен. Сохраняет ли realloc() состояние массива, добавляя больше места? Также возвращает ли free() указатель на тот же блок памяти, чтобы я мог снова вызвать для него realloc()?

Спасибо за любые ответы!


person Kody Richardson    schedule 26.02.2019    source источник
comment
как выглядит struct utmp?   -  person machine_1    schedule 27.02.2019
comment
roster - это указатель, а не массив. Вы не можете знать размер базовых данных с sizeof на указателе. Вы выделили 1 struct utmp, поэтому размер базовых данных равен 1*sizeof(struct utmp).   -  person Dustin Nieffenegger    schedule 27.02.2019
comment
@Kody Richardson - в вашем примере кода есть несколько проблем. Я пытался разбить их в ответ, но кто-то оборвал меня на коленях с отрицательными голосами. ОСНОВНАЯ ПРОБЛЕМА: sizeof(ptr) не возвращает размер структуры, массива или объекта — он просто возвращает #/bytes в указателе (часто 4, для 32-битного процессора). Нет: free() НЕ возвращает НИЧЕГО. Посмотрите здесь: человек свободен. Наконец, нет: вы не можете перераспределить() память, которую вы уже освободили(). Вопрос: Ответы на вопросы?   -  person paulsm4    schedule 27.02.2019
comment
@ paulsm4 Да, это многое проясняет! Благодарю вас!   -  person Kody Richardson    schedule 28.02.2019
comment
@DustinNieffenegger Спасибо, что указали на мою ошибку в списке!!   -  person Kody Richardson    schedule 28.02.2019