Рассмотрим следующий пример кода:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(sizeof *a);
*a = 5;
free(a);
return 0;
}
В этом примере я выделяю целое число a
в куче и инициализирую его равным 5. Эта строка специально
int *a = malloc(sizeof *a);
это то, что смущает меня (часть sizeof *a
). Для меня это выглядит так, будто я пытаюсь получить размер переменной еще до того, как она будет создана, но я вижу, что этот стиль для инициализации указателей чрезвычайно распространен. Когда я компилирую этот код с помощью clang, я не получаю никаких ошибок или предупреждений. Почему компилятор позволяет это? Насколько я могу судить, это все равно что делать что-то вроде
int a = a + 1;
без какого-либо предыдущего объявления a
. Это выдает предупреждение с clang -Wall main.c
:
main.c:17:13: warning: variable 'a' is uninitialized when used
within its own initialization [-Wuninitialized]
int a = a + 1;
Чем эта строка отличается от объявления указателя с sizeof
?