Определение структуры в 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 не обязательно предвидит. Я упомянул об этом более подробно в мой ответ: к вопросу "самая странная особенность языка".