Здравствуйте, Аноним, Вы писали:
А>Есть такая программа.
А>#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, видна только в данном модуле (имеет внутреннюю компоновку).
Здравствуйте, Glоbus, Вы писали:
G>Здравствуйте, mefrill, Вы писали:
M>>Здравствуйте, Glоbus, Вы писали:
G>>>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.
M>>Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором
G>не будет прогнал прошу коллектив простить и дать возможность искупить кровью
kiamor:
> A>Не-а! Согласно определениям обоих языков (Си и Си++)...
> Хех, уважаемый... Если бы все компиляторы были реализованы на 100% в > соответствии со спецификацией... Да и за примерами далеко ходить не надо
Приведи хотя бы один, который не проинициализирует эту переменную нулем.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
kiamor:
> ПК>Приведи хотя бы один, который не проинициализирует эту переменную нулем.
> Watcom под QNX 4.x например. Речь идёт о 9 и предшественниках.
Что-то я не нашел подтверждений, что это, действительно, так. Мы оба говорим о статической инициализации? Watcom 9 не такой уж старый компилятор, чтобы не соответствовать даже самым ранним черновикам первого стандарта C
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Bell, Вы писали:
S>>Я клоню к тому, какой смысл вообще объявлять глоб. переменную с ключом static? По всей видимости глобальные перем. также инициализируются нулем, как и статические. Тогда в чем разница?
B>Смысл в том, что глобальная переменная, объявленная как static, видна только в данном модуле (имеет внутреннюю компоновку).
Написал маленький тест. Оказывается в пределах модуля скрывается не сама глобальная статическая переменная, а ее экземпляр. Т.е. в другом модуле можно использовать имя этой переменной, но не значение. На самом деле это уже будут совсем разные переменные.
есть 2 модуля
var.h :
static int variable;
main.cpp — юзает модуль var
#include"var.h"int main()
{
variable++; // Нормально, хотя переменная variable - объявлена static в другом модуле.
}
variable++ не изменяет значение переменной variable в модуле var.
Здравствуйте, sevtov, Вы писали:
S>Написал маленький тест. Оказывается в пределах модуля скрывается не сама глобальная статическая переменная, а ее экземпляр. Т.е. в другом модуле можно использовать имя этой переменной, но не значение. На самом деле это уже будут совсем разные переменные.
S>есть 2 модуля
S>var.h :
S>
S>static int variable;
S>
S>main.cpp — юзает модуль var
S>
S>#include"var.h"
S>int main()
S>{
S> variable++; // Нормально, хотя переменная variable - объявлена static в другом модуле.
S>}
S>
S>variable++ не изменяет значение переменной variable в модуле var.
Это какой компилятор? Попахивает финтами ушами.
... << RSDN@Home 1.1.3 stable >>
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
s> #include"var.h"
s> int main()
s> {
s> variable++; // Нормально, хотя переменная variable - объявлена
s> static в другом модуле. }
s>
s> variable++ не изменяет значение переменной variable в модуле s> var.
Нет никакого модуля var, var.h просто текстовый файл который включается в том месте где написать #include "var.h". В твоем примере ОДНА переменная variable. Соответственно она и меняется. Грубо говоря сколько раз ты напишешь (в разных cpp) #include "var.h" столько у тебя и будет переменных variable. И вне cpp эта переменная видна не будет. Об этом и говорил Bell.