Указатель в .h автоматически устанавливается в NULL? - PullRequest
1 голос
/ 21 февраля 2010

Если я объявлю указатель на структуру в .h, например:

my_struct_t *ptr;

... и затем я проверяю if(ptr==NULL) в коде, фактически не устанавливая ptr в NULL или не выделяя для него память. Могу ли я сделать эту проверку, чтобы увидеть, равно ли оно NULL?

По сути, я спрашиваю, что, имея ptr в .h, он автоматически устанавливается в NULL, или я должен это сделать?

Спасибо, Христо

revisiont: это сделано в C

Ответы [ 6 ]

4 голосов
/ 21 февраля 2010

От K & R2nd:

При отсутствии явных инициализаций внешние и статические переменные гарантированно инициализируются нулями.

Итак, да.

Похоже, что это в разделе A8.7 стандарта 1990 года. Не знаю, где искать в стандарте 1999 года.

1 голос
/ 21 февраля 2010

Чтобы ответить на ваш вопрос, да, он будет установлен в NULL. Переменная будет иметь глобальную область видимости, а переменные с глобальным временем жизни инициализируются значением NULL (для указателей).

Однако не следует помещать определение переменной в файл .h. Если вы включите этот файл .h в более 1 файла .c, у вас будет несколько определений этой переменной, что нежелательно.

Вы должны поместить объявление в заголовочный файл, например,

extern my_struct_t *ptr;

И затем в одном из ваших .c файлов поместите определение:

my_struct_t *ptr;
1 голос
/ 21 февраля 2010

Это неправильная декларация, вы должны объявить ее так:

 extern my_struct_t *ptr;

И где-то в файле с исходным кодом .c фактически определите это:

 my_struct_t *ptr;  

Что сделает его инициализированным нулями.

0 голосов
/ 21 февраля 2010

Вот что говорит K & R:

Внешние и статические переменные по умолчанию обнуляются. Автоматические переменные, для которых нет явного инициализатора, имеют неопределенные (то есть, мусорные) значения.

Автоматические переменные - это те, которые объявлены внутри функции. Так как вы сказали .h файл, ваш, вероятно, снаружи и, следовательно, статический.

В противном случае, я полагаю, вы могли бы добавить "= NULL" к объявлению, и поэтому вам не нужно помнить, чтобы сделать это в другом месте.

Я стараюсь не создавать никаких выделений или кода в .h файле.

0 голосов
/ 21 февраля 2010

extern struct foo* pfoo; в заголовочном файле и struct foo* pfoo; в одном из .c файлов вне функции даст вам статическое хранилище для указателя и, таким образом, автоматическую инициализацию в ноль.

extern квалификатор является ключевым здесь. Он указывает компилятору не выделять память для указателя в каждой единице перевода .

0 голосов
/ 21 февраля 2010

Глобальные переменные автоматически обнуляются. Смотрите случаи в моем ответе на другой вопрос .

Помните, что определение переменных в заголовочном файле - очень плохая практика - если несколько исходных файлов содержат этот заголовок, у вас будут повторяющиеся символы и вы не сможете связать программу. Лучше объявить эту переменную как extern в заголовке и определить ее только в одном исходном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...