Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.059 c
2-1198071249
Alik
2007-12-19 16:34
2008.01.20
Кодировка КОИ-8 в текстовом файле


2-1197660955
NaRuTo
2007-12-14 22:35
2008.01.20
Уменьшение ресурсов!


3-1189403226
O.O
2007-09-10 09:47
2008.01.20
Конкатенация в FB


15-1197918092
Eraser
2007-12-17 22:01
2008.01.20
Цифровая подпись для exe и dll модулей


2-1198069448
kyn66
2007-12-19 16:04
2008.01.20
RecNo у TADsQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский