Первый (плохой) foo указывает на указатель мусора.Вы можете удалить предупреждение, инициализировав его как Foo* foo = NULL;
, но тогда вы получите ошибку, когда попытаетесь разыменовать его (ошибка времени выполнения).
Второй (хороший) не жалуется, потому что C автоматическиИнициализирует переменные в области видимости единицы перевода как NULL или 0 или соответствующий эквивалент, если они еще не инициализированы.
Последний (хороший) не жалуется, потому что вы вызываете метод для объекта иприсвоение указателя на функцию выполняется компилятором, аналогично, но не совпадает с номером 2. Таким образом, компилятор уже знает адрес метода method
и назначил этот адрес соответствующему расположению в структуре Foo
.