Неинициализированные указатели в объектах со статической продолжительностью хранения инициализируются в NULL или для всех нулей? - PullRequest
4 голосов
/ 06 июня 2011

из любопытства и из-за того, что у меня сейчас нет моей копии стандарта:

Учитывая реализацию, в которой нулевые указатели не представлены шаблоном со всеми нулями, будут неинициализированы члены-указателиобъекты со статической продолжительностью хранения должны быть инициализированы для правильного значения нулевого указателя или для значения со всеми нулями?

Меньше стандартного, больше кода:

struct foo {
    void *p;
};

foo f;

При условии представления нулевого указателя 0x00000001Что я могу ожидать для побитового представления fp в начале main () ?

Ответы [ 2 ]

5 голосов
/ 06 июня 2011

Стандарт гласит (8.5 / 4):

Инициализация объекта типа T с нуля означает:

- если T является скалярным типом, объектустанавливается в значение 0 (ноль), принимается как целочисленное значение константы, преобразуется в T

- если T является типом класса, не являющимся объединением, каждый нестатический элемент данных и каждая базаподобъект -класса инициализируется нулями;

Итак, f эффективно инициализируется как f = { (void *)0 }, и мы знаем из 4.10 / 1:

Константа нулевого указателяявляется целочисленным константным выражением rvalue целочисленного типа, которое оценивается как ноль.Константа нулевого указателя может быть преобразована в тип указателя;результатом является значение нулевого указателя этого типа

Таким образом, вы получите правильное значение NULL.

2 голосов
/ 06 июня 2011

к правильному значению нулевого указателя.См. 8.5 / 5

  • , если T является скалярным типом [и указатель является скалярным типом, см. 3.9 / 10], объекту присвоено значение 0 (ноль), преобразованное в T
...