Определение структуры в C с помощью Malloc

попросил вопрос ранее при определении структуры с помощью malloc. Таков был ответ, данный мне большинством:--5-->

struct retValue* st = malloc(sizeof(*st));

Я показывал другу свой код, и мы подошли к камню преткновения. Может кто-нибудь объяснить, почему этот код работает? С моей точки зрения, * st не был определен, когда вы его malloc, поэтому там может быть любой мусор. Он должен быть!--1-->

Спасибо за помощь

4 ответов


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

в вашем примере st уже объявлен как указатель на структуру-retValue. Следовательно, компилятор может вывести тип выражения "*ст".

хотя это не похоже на то, что он уже объявлен в вашем коде, компилятор уже позаботился об этом за вас. Все объявления в коде перемещаются в начало блока, в котором они возникают компилятором. Предположим, вы напишете

один из способов проиллюстрировать знания, доступные компилятору, - посмотреть на промежуточный вывод, который он генерирует. Рассмотрим этот пример кода...

struct retValue {long int a, long int b};
...
printf("Hello World!\n");
struct retValue* st = malloc(sizeof(*st));

использование gcc в качестве примера и выше кода в main () функции


на sizeof оператор фактически не оценивает свой операнд - он просто смотрит на его тип. Это делается во время компиляции, а не во время выполнения. Таким образом, это можно безопасно выполнить до назначения переменной.


значение имеет объявление / определение типа структуры, а не определение объекта такого класса. К тому времени, когда вы достигнете malloc, объявление/определение будет обнаружено компилятором, в противном случае вы нажмете ошибку компилятора.

тот факт, что sizeof не оценивает его операнды является побочной проблемой.

мелкий нит: помните, что мы нужно скобки, когда мы поставляем имена типов в sizeof as в:

sizeof(struct retValue);

и не в случае объектов, мы просто делаем:

sizeof *st;

см. Стандарт:

6.5.3 синтаксис унарных операторов

unary-expression:
[...]
sizeof unary-expression
sizeof ( type-name )

В C,sizeof является оператором и не оценивает его аргумент. Это может привести к" интересным " эффектам, которые кто-то новый для C не обязательно предвидит. Я упомянул об этом более подробно в мой ответ: к вопросу "самая странная особенность языка".