Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Занулить структуру / 11 сообщений из 11, страница 1 из 1
02.03.2013, 16:55
    #38172030
Poppler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
Есть структура, допустим такая:

Код: plaintext
1.
2.
3.
4.
5.
6.
struct sExample
{
    bool m_bFirst;
    char m_cChar;
    int m_nValue;
};



Нужно при инстанцировании объекта этой структуры занулить все поля. Понятно, что можно тупо прописать присваивание нулей всех полям. Вопрос вот в чём, часто вижу такую форму создания структур:

Код: plaintext
1.
sExample sEx = {0};



такой синтаксис присваивает ноль только первому члену или всем членам структуры?
...
Рейтинг: 0 / 0
02.03.2013, 19:02
    #38172087
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
Poppler
Код: plaintext
1.
sExample sEx = {0};



такой синтаксис присваивает ноль только первому члену или всем членам структуры?
Указанное значение (в данном случае 0) инициализирует соответствующее по порядку поле.
Поля для которых значения не указаны, инициализируются значением по умолчанию T(). Для числовых типов оно равно 0.
Т.е. например в следующем коде первое поле инициализируется 1, а следующие за ним - нулями.
Код: plaintext
1.
sExample sEx = {1};
...
Рейтинг: 0 / 0
02.03.2013, 20:28
    #38172127
в чистом C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
Anatoly MoskovskyPoppler
Код: plaintext
1.
sExample sEx = {0};



такой синтаксис присваивает ноль только первому члену или всем членам структуры?
Указанное значение (в данном случае 0) инициализирует соответствующее по порядку поле.
Поля для которых значения не указаны, инициализируются значением по умолчанию T(). Для числовых типов оно равно 0.
Т.е. например в следующем коде первое поле инициализируется 1, а следующие за ним - нулями.
Код: plaintext
1.
sExample sEx = {1};


А в чистом C так же?
...
Рейтинг: 0 / 0
02.03.2013, 23:01
    #38172177
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
в чистом C,

Да, в С то же самое
...
Рейтинг: 0 / 0
03.03.2013, 13:17
    #38172399
Poppler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
Anatoly MoskovskyУказанное значение (в данном случае 0) инициализирует соответствующее по порядку поле.
Поля для которых значения не указаны, инициализируются значением по умолчанию T(). Для числовых типов оно равно 0.


А почему, если написать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct sExample
{
    bool m_bFirst;
    char m_cChar;
    int m_nValue;
};

sExample sEx;



студия в debug режиме показывает, что поля не проинициализированы и в них мусор?
...
Рейтинг: 0 / 0
03.03.2013, 13:21
    #38172403
Poppler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
А GCC показывает , что поля занулены. Почему так?
...
Рейтинг: 0 / 0
03.03.2013, 13:52
    #38172425
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
Popplerстудия в debug режиме показывает, что поля не проинициализированы и в них мусор?
это не мусор, а специальные значения, которые отладчик трактует как неициализированные
...
Рейтинг: 0 / 0
03.03.2013, 22:47
    #38172732
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
PopplerAnatoly MoskovskyУказанное значение (в данном случае 0) инициализирует соответствующее по порядку поле.
Поля для которых значения не указаны, инициализируются значением по умолчанию T(). Для числовых типов оно равно 0.


А почему, если написать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct sExample
{
    bool m_bFirst;
    char m_cChar;
    int m_nValue;
};

sExample sEx;



студия в debug режиме показывает, что поля не проинициализированы и в них мусор?
Вы так спрашиваете как будто я выше обещал что там не будет мусора
В данном случае инициализатор не указан, поэтому действуют следующие правила.
Если это объявление глобальной или статической переменной (не путать со статическим членом класса) то все члены инициализируются нулями.
Если это локальная автоматическая переменная то никакой инициализации вообще не производится, там мусор.
То что в некоторых случаях там нули вместо мусора - это могут быть внутренние потребности компилятора, на которые вы никак не должны рассчитывать.
Я уже не говорю о том что мусор во многих случаях тоже может быть нулями, т.к. очень часто стек только что запущенной программы (а именно в стеке создаются локальные переменные) содержит довольно большие участки с нулями.
...
Рейтинг: 0 / 0
04.03.2013, 12:16
    #38173123
landy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
ИМХО, задачи очистки памяти лежат на ядре ОС(как реализовано выделение памяти прикладным программам)
То что конкретная реализация компилятора как-то инициализирует память - это свойство этого компилятора
В общем случае - там мусор и инициализировать лучше самому принудительно
Или правила инициализации где-то в стандарте прописаны?
...
Рейтинг: 0 / 0
04.03.2013, 15:17
    #38173415
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
landyИли правила инициализации где-то в стандарте прописаны?
Конечно прописаны.
...
Рейтинг: 0 / 0
04.03.2013, 22:12
    #38173912
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Занулить структуру
landyИли правила инициализации где-то в стандарте прописаны?
Раздел 8.5 стандарта, так и называется - Initializers.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Занулить структуру / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]