Здравствуйте, Аноним, Вы писали:
А>Есть такая программа.
А>#include "stdafx.h" А>static char sc;
А>int _tmain(int argc, _TCHAR* argv[]) А>{
А> return 0; А>}
А>В какой момент выделяется память для переменной sc, когда и как она инициализируется?
До вызова main происходит инициализация глобальных переменных.
Можно кое-что почитать здесь
Здравствуйте, Аноним.
А>В какой момент выделяется память для переменной sc, когда и как она инициализируется?
Такая переменная будет отнесена к области неинициализированных переменных процесса после загрузки его в память. (Аналог — сегмент BSS в DOS'е). Чем она будет проинициализирована зависит и от компилятора/линкера и от платформы. Если компилятор обнуляет все неинициализированные переменные — значит будет 0. Если нет — будет то, что содержится в памяти, отведённой под эту переменную при размещении процесса. Если ОС обнуляет память выделяемую процессу (запрошенную процессом) — тогда будет 0. Иначе — может быть случайное значение.
Здравствуйте, kiamor, Вы писали:
K>Такая переменная будет отнесена к области неинициализированных переменных процесса после загрузки его в память. (Аналог — сегмент BSS в DOS'е). Чем она будет проинициализирована зависит и от компилятора/линкера и от платформы. Если компилятор обнуляет все неинициализированные переменные — значит будет 0. Если нет — будет то, что содержится в памяти, отведённой под эту переменную при размещении процесса. Если ОС обнуляет память выделяемую процессу (запрошенную процессом) — тогда будет 0. Иначе — может быть случайное значение.
Не-а! Согласно определениям обоих языков (Си и Си++), не инициализированный явно объект в данном случае будет инициализирован по умолчанию, что в случае встроенного типа означает нуль-инициализацию.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Здравствуйте, Аноним, Вы писали:
А>Есть такая программа.
А>#include "stdafx.h" А>static char sc;
А>int _tmain(int argc, _TCHAR* argv[]) А>{
А> return 0; А>}
А>В какой момент выделяется память для переменной sc, когда и как она инициализируется?
Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.
Здравствуйте, Glоbus, Вы писали:
G>... проинициализировано она будет до входа в мейн
Это верно.
G>...и будет там в ней мусор если не ошибаюсь.
А вот тут ошибаешься
3.6.2/1
The storage for objects with static storage duration (3.7.1) shall be zero-initialized
(8.5) before any other initialization takes place.
Здравствуйте, Glоbus, Вы писали:
G>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.
Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором
Здравствуйте, kiamor, Вы писали:
K>Такая переменная будет отнесена к области неинициализированных переменных процесса после загрузки его в память. (Аналог — сегмент BSS в DOS'е). Чем она будет проинициализирована зависит и от компилятора/линкера и от платформы. Если компилятор обнуляет все неинициализированные переменные — значит будет 0. Если нет — будет то, что содержится в памяти, отведённой под эту переменную при размещении процесса. Если ОС обнуляет память выделяемую процессу (запрошенную процессом) — тогда будет 0. Иначе — может быть случайное значение.
По стандарту — ноль! И VC++.NET 2003 именно это и делает.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, mefrill, Вы писали:
M>Здравствуйте, Glоbus, Вы писали:
G>>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.
M>Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором
Не-а. Там будет 0! А если не ноль — выкиньте тот компилятор!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Glоbus, Вы писали:
G>>... проинициализировано она будет до входа в мейн B>Это верно.
G>>...и будет там в ней мусор если не ошибаюсь. B>А вот тут ошибаешься B>
B>3.6.2/1
B>The storage for objects with static storage duration (3.7.1) shall be zero-initialized
B>(8.5) before any other initialization takes place.
B>
Здравствуйте, mefrill, Вы писали:
M>Здравствуйте, Glоbus, Вы писали:
G>>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.
M>Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором
не будет прогнал прошу коллектив простить и дать возможность искупить кровью
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, mefrill, Вы писали:
M>>Здравствуйте, Glоbus, Вы писали:
G>>>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.
M>>Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором LVV>Не-а. Там будет 0! А если не ноль — выкиньте тот компилятор!
Согласен.
Все глобальные и статические переменные располагаются в некоторой заранее отведенной статической памяти (в отличие от локальных переменных, которые располагаются в стеке). И простые глобальные переменные и статические глоб. переменные видны в пределах всего модуля, а если подключить файл с глоб. перем. к другому модулю, то будут видны и там.
Я клоню к тому, какой смысл вообще объявлять глоб. переменную с ключом static? По всей видимости глобальные перем. также инициализируются нулем, как и статические. Тогда в чем разница?
Здравствуйте, sevtov, Вы писали:
S>Согласен. S>Все глобальные и статические переменные располагаются в некоторой заранее отведенной статической памяти (в отличие от локальных переменных, которые располагаются в стеке). И простые глобальные переменные и статические глоб. переменные видны в пределах всего модуля, а если подключить файл с глоб. перем. к другому модулю, то будут видны и там. S>Я клоню к тому, какой смысл вообще объявлять глоб. переменную с ключом static? По всей видимости глобальные перем. также инициализируются нулем, как и статические. Тогда в чем разница?
Смысл в том, что глобальная переменная, объявленная как static, видна только в данном модуле (имеет внутреннюю компоновку).