powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Занулить структуру
11 сообщений из 11, страница 1 из 1
Занулить структуру
    #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
Занулить структуру
    #38172087
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Poppler
Код: plaintext
1.
sExample sEx = {0};



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



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


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

Да, в С то же самое
...
Рейтинг: 0 / 0
Занулить структуру
    #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
Занулить структуру
    #38172403
Фотография Poppler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А GCC показывает , что поля занулены. Почему так?
...
Рейтинг: 0 / 0
Занулить структуру
    #38172425
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Popplerстудия в debug режиме показывает, что поля не проинициализированы и в них мусор?
это не мусор, а специальные значения, которые отладчик трактует как неициализированные
...
Рейтинг: 0 / 0
Занулить структуру
    #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
Занулить структуру
    #38173123
landy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, задачи очистки памяти лежат на ядре ОС(как реализовано выделение памяти прикладным программам)
То что конкретная реализация компилятора как-то инициализирует память - это свойство этого компилятора
В общем случае - там мусор и инициализировать лучше самому принудительно
Или правила инициализации где-то в стандарте прописаны?
...
Рейтинг: 0 / 0
Занулить структуру
    #38173415
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
landyИли правила инициализации где-то в стандарте прописаны?
Конечно прописаны.
...
Рейтинг: 0 / 0
Занулить структуру
    #38173912
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
landyИли правила инициализации где-то в стандарте прописаны?
Раздел 8.5 стандарта, так и называется - Initializers.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Занулить структуру
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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