Я пытаюсь создать динамический массив в 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()?
Спасибо за любые ответы!
struct
utmp? - person machine_1   schedule 27.02.2019roster
- это указатель, а не массив. Вы не можете знать размер базовых данных сsizeof
на указателе. Вы выделили 1struct utmp
, поэтому размер базовых данных равен1*sizeof(struct utmp)
. - person Dustin Nieffenegger   schedule 27.02.2019