Прежде всего, давайте кратко о initialization
против assignment
.
Это используется для указания начального значения объекта.Обычно это означает, что только во время определения переменной происходит инициализация. Значение для инициализации объекта называется initalizer. Из C11
, глава 6.7.9
,
Инициализатор определяет начальное значение, хранящееся в объекте.
Назначение является назначение (или установка) значение переменной, в любой (действительной) данный момент времени исполнения. Цитирование стандарта, глава 6.5.16
,
Оператор присваивания сохраняет значение в объекте, обозначенном левым операндом.
В случае простого присваивания (=
оператора),
В простом присвоении (=
), значение правого операнда преобразуется к типу выражения в назначения и заменяет значение, хранящееся в объекте, обозначенном левым операндом.
То есть, я думаю, ваш запрос должен делать с инициализацией static
объекта.
Для первого случая,
static int *st_ptr = malloc(sizeof(int));
Цитируя C11
стандартного документа, глава §6.7.9
, инициализация, пункт 4,
Всех выражения в инициализаторе для объекта, который имеет статический или длительность хранения потоков должны быть постоянными выражениями или строковыми литералами.
и относительно постоянное выражение, из главы 6.6 того же документа (курсив мой)
Постоянные выражения не должны содержать назначение, увеличение, уменьшение, вызова функции , или операторы запятой, за исключением случаев, когда они содержатся в подвыражении, которое не равно .
ясно, malloc(sizeof(int));
не константа, поэтому мы не можем использовать его для инициализации static
объекта.
Для второго случая,
static int *st_ptr;
st_ptr = malloc(5*sizeof(int));
вы не инициализацииstatic
объекта. Вы оставляете его неинициализированным. Следующая инструкция: присваивает возвращаемое значение malloc()
. Поэтому ваш компилятор не вызывает никаких жалоб.
Оба они очень опасны и в стороне от обучения, их следует избегать. –
Ваш второй пример будет скомпилирован, но он все еще не прав: он будет выделять новое хранилище каждый раз при вызове функции, протекая старое. Инициализируйте переменную до NULL и проверьте NULL перед вызовом 'malloc', чтобы он вызывался только один раз. – Wyzard
@DavidHaim: О чем именно вы говорите? – dhein