Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.20;
Скачать: CL | DM;

Вниз

Инициализация переменных в С   Найти похожие ветки 

 
Riply ©   (2007-12-16 22:40) [0]

Здравствуйте !
А в С, при объявлении переменные часом сами не инициализируются нулями ?
А то какие-то странные исходники смотрю :)


 
homm ©   (2007-12-16 22:43) [1]

> [0] Riply ©   (16.12.07 22:40)
> А то какие-то странные исходники смотрю :)

Дак и нам дай посмотреть, точно скажем :)


 
homm ©   (2007-12-16 22:43) [2]

В общем случае нет, но переменная можт быть объявлена как статичная, тогда при старте приложения в ней бет ноль вроде бы.


 
boa_kaa ©   (2007-12-16 22:44) [3]


> Riply ©   (16.12.07 22:40)  

если C без #, то они ничем не инициализируются


 
Zeqfreed ©   (2007-12-16 22:52) [4]

http://publications.gbdirect.co.uk/c_book/chapter6/initialization.html

Unless they have an explicit initializer, all objects with static duration are given implicit initializers—the effect is as if the constant 0 had been assigned to their components. This is in fact widely used—it is an assumption made by most C programs that external objects and internal static objects start with the value zero.


 
Alkid   (2007-12-16 23:08) [5]

С++:
Статические по умолчанию инициализируются нулями.
Стековые по умолчанию не инициализируются.
Динамические не инициализируются никак.

В С вроде так же.


 
etc   (2007-12-16 23:14) [6]

вырежут, но истина дороже :)
почему этот топик не вопрос в "интелектуальный яндекс"?


 
Riply ©   (2007-12-16 23:15) [7]

Спасибо всем !


 
homm ©   (2007-12-16 23:26) [8]

> [7] Riply ©   (16.12.07 23:15)
> Спасибо всем !

Дак как там на самом деле? Статические были?


 
Petr V. Abramov ©   (2007-12-16 23:39) [9]

> homm ©   (16.12.07 23:26) [8]
в экпериментах, котрые ставила ув. Riply © были похожи не статические :)


 
J_f_S   (2007-12-17 01:54) [10]

В зависимости от опций компиллятора, (например, если строишься в дебаге), могут быть проинициализированы и стековые(локальные) переменные, причем совсем не обязательно нулями. Если мне склероз не изменяет, то MSVS инициализирует память последовательностью 0x0C.


 
Германн ©   (2007-12-17 02:00) [11]


> J_f_S   (17.12.07 01:54) [10]
>
> В зависимости от опций компиллятора, (например, если строишься
> в дебаге), могут быть проинициализированы и стековые(локальные)
> переменные, причем совсем не обязательно нулями. Если мне
> склероз не изменяет, то MSVS инициализирует память последовательностью
> 0x0C.
>

Хм. А зачем забивать память значениями 0х0С?


 
J_f_S   (2007-12-17 02:12) [12]


> Хм. А зачем забивать память значениями 0х0С?

Нули не особо много говорят при отладке, на самом деле, поскольку не понятно, кто проинициализировал память - сам программист, или компиллятор. И при попытке собраться в релизе вроде бы корректные на этапе дебага значения переменных превращаются в результат работы генератора случайных чисел. Если при отладке видишь в какой-то переменной что-то типа 0x0C то сразу ясно, где работал компиллятор, и где не доработал программист.

Тоже не панацея, конечно, но немного проще.


 
Германн ©   (2007-12-17 02:24) [13]


> J_f_S   (17.12.07 02:12) [12]
>
>
> > Хм. А зачем забивать память значениями 0х0С?
>
> Нули не особо много говорят при отладке, на самом деле,
> поскольку не понятно, кто проинициализировал память - сам
> программист, или компиллятор.

Имхо, передергиваешь.


 
J_f_S   (2007-12-17 02:49) [14]

Не 0x0C, а 0xCC.
И в дебаге MSVC инициализирует и память, выделенную динамически, вот.


 
Германн ©   (2007-12-17 02:52) [15]


> J_f_S   (17.12.07 02:49) [14]
>
> Не 0x0C, а 0xCC.
>


> J_f_S   (17.12.07 01:54) [10]
>
> В зависимости от опций компиллятора, (например, если строишься
> в дебаге), могут быть проинициализированы и стековые(локальные)
> переменные, причем совсем не обязательно нулями. Если мне
> склероз не изменяет, то MSVS инициализирует память последовательностью
> 0x0C.
>

Как прикажешь понимать тебя, Саид?
:)


 
Германн ©   (2007-12-17 03:06) [16]


> И в дебаге MSVC инициализирует и память, выделенную динамически,
>  вот.
>

А это зачем? Чтобы "скрыть ошибки автора программы" ?


 
KSergey ©   (2007-12-17 09:58) [17]

> Riply ©   (16.12.07 22:40)  

Вот у меян только один вопрос: имеется в виду именно Си или Си с плюсами? Нельзя ли уточнять в будущем?


 
homm ©   (2007-12-17 10:00) [18]

> [17] KSergey ©   (17.12.07 09:58)
> имеется в виду именно Си или Си с плюсами?

А что, в сабже не написано? Нельзя ли читать в следующий раз?


 
KSergey ©   (2007-12-17 10:06) [19]

> homm ©   (17.12.07 10:00) [18]
> А что, в сабже не написано? Нельзя ли читать в следующий раз?

Написано. Но имею некоторые сомнения без уточнения.


 
homm ©   (2007-12-17 10:08) [20]

> [19] KSergey ©   (17.12.07 10:06)
> Но имею некоторые сомнения без уточнения

Никак не могу взять в толк, что есть уточнение… Ладно, флуд все это.


 
Kerk ©   (2007-12-17 10:09) [21]

0хСС -  это код брекпоинта, 3е вроде прерывание


 
KSergey ©   (2007-12-17 10:10) [22]

> homm ©   (17.12.07 10:08) [20]
> Никак не могу взять в толк, что есть уточнение…

"Си без плюсов"
Ну просто интересно все же что имела в виду автор.


 
Игорь Шевченко ©   (2007-12-17 10:44) [23]

нет, не инициализируются


 
clickmaker ©   (2007-12-17 11:30) [24]

в дебаге (MS VS 2003, по крайней мере) локальные переменные инициализируются нулями.
Это может вызвать забавный казус, когда релиз вызывает AV, а начинаешь отлаживать - он пропадает )


 
Zeqfreed ©   (2007-12-17 11:30) [25]

> KSergey ©   (17.12.07 10:10) [22]

Ага, а так же Паскаль, который не объектный и Ява, которая не скрипт.


 
boa_kaa ©   (2007-12-17 12:53) [26]


> Alkid   (16.12.07 23:08) [5]

это поэтому C++ требует обязательной инициализации членов класса в конструкторе?


 
Alkid ©   (2007-12-17 13:07) [27]


> это поэтому C++ требует обязательной инициализации членов
> класса в конструкторе?

А он таки их требует? :)

На самом деле в списке инициализации конструктора *требуется* указывать только те подобъекты, которые не имеют дефолтных консткукторов (т.е. не имеющих параметров). Те, у которых они есть можно указывать, а можно и не указывать.

пример:

class A
{
private:
 int field;
public:
 A(int i) // ошибки не будет, но поле field останется непроинициализированным
 {
 }
}

class B
{
private:
 A a;
public:
 B() : a(10) // без этого инициализатора программа не скомпилируется, ибо              
                // клас A не имеет дефолтного конструктора.
 {
 }
}



Страницы: 1 вся ветка

Текущий архив: 2008.01.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
15-1197466264
Kerk
2007-12-12 16:31
2008.01.20
Есть ли тут счастливые обладатели робопылесосов типа RV-2/RV-10


2-1198424105
Бэтман
2007-12-23 18:35
2008.01.20
Проблема с печатью quick report


15-1197374566
PEAKTOP
2007-12-11 15:02
2008.01.20
Вертикальная совместимость - Ваше мнение


15-1197883093
начинающий
2007-12-17 12:18
2008.01.20
Плазма белый отдаёт лиловым. Но не весь.


15-1197727186
turbouser
2007-12-15 16:59
2008.01.20
Хоккей