русский
Germany.ruForen → Архив Досок→ Programmierung

Тупой вопрос по С: инитиализация структуры

660  1 2 alle
rahimov80 завсегдатай12.06.09 16:56
12.06.09 16:56 
Если у меня есть array, то я могу его инитиализировать, не определя всех элементов
int myArr[5] = {0};
myArr[1]= myArr[2]=..=0;
это по оределению.
А если у меня есть структура и я указал
struct myStr {
int a;
int b;
char* c;
} myStrVar = {0};
то какое значение будет у myStrVar.b; myStrVar.c ?
Обнулится ли?
Не особо хочу примеры: "А у себя на компьютере я так проверил и получил..."
Меня не интересует имплементация на данном компьютере, а интересует, что по этому поводу говорит стандарт, K&R, etc.
Спасибо...
#1 
Murr коренной житель12.06.09 19:37
Murr
NEW 12.06.09 19:37 
in Antwort rahimov80 12.06.09 16:56
По K&R - элементы, для которых не определены инициализаторы, инициируются нулем.
Однако это работает только в контексте инициализации - без списка инициализации,
если Я правильно помню, массив вообще не будет инициализирован.
#2 
alex_martirosov посетитель17.06.09 10:33
alex_martirosov
NEW 17.06.09 10:33 
in Antwort Murr 12.06.09 19:37
Да нифига не будет инициализированно - источник багов.
Добавь конструктор и проиницилизируй ручками
#3 
Murr коренной житель17.06.09 10:49
Murr
NEW 17.06.09 10:49 
in Antwort alex_martirosov 17.06.09 10:33
Прелестно. Добавлю. Только напиши как это сделать с Сях?!.
#4 
AlexOtt постоялец17.06.09 12:19
AlexOtt
NEW 17.06.09 12:19 
in Antwort Murr 17.06.09 10:49
memset(&structVar,0,sizeof(struct));
#5 
Murr коренной житель17.06.09 12:32
Murr
NEW 17.06.09 12:32 
in Antwort AlexOtt 17.06.09 12:19
??? - memset() стало конструктором? А нельзя ли его еще и виртуальным сделать?
Автор спросил - Как написано в Cтандартах или у Великих? - как написано у K&R Я ответил.
Как реализовано в конкретном компиляторе - надо смотреть, тестить и, возможно, юзать
memset()...
#6 
Kabal коренной житель17.06.09 15:07
Kabal
NEW 17.06.09 15:07 
in Antwort Murr 12.06.09 19:37
В ответ на:
По K&R - элементы, для которых не определены инициализаторы, инициируются нулем.

Ссылочку на K&R можно увидеть?
- Живем один раз! - Нет, мы умираем один раз. А живем мы каждый день.
#7 
AlexOtt постоялец17.06.09 17:36
AlexOtt
NEW 17.06.09 17:36 
in Antwort Kabal 17.06.09 15:07
В стандарте написано вот что:
If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these rules.
#8 
Murr коренной житель17.06.09 17:47
Murr
NEW 17.06.09 17:47 
in Antwort Kabal 17.06.09 15:07
Пратта и Ко
http://www.library.ospu.odessa.ua/online/books/c/12.htm
Цитата из стандарта по С++
http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=128916
По K&R - читай 6.3. Массивы сруктур
#9 
AlexOtt постоялец17.06.09 20:52
AlexOtt
NEW 17.06.09 20:52 
in Antwort Murr 12.06.09 19:37
static int a;
int main(int argc,char** argv) {
int b;
printf("%d %d\n",a,b);
return 0;
}
./t1
0 -1073744700
что и соответствует стандарту. выделение переменных на стеке производится одной командой, которая просто уменьшает соответствующий указатель çтека
#10 
Kabal коренной житель17.06.09 20:56
Kabal
NEW 17.06.09 20:56 
in Antwort AlexOtt 17.06.09 17:36
В ответ на:
its value is indeterminate

Вот именно. А геноссе нам че-то про нули двигает. Автоматические переменные, однако, спецом не инициализируются.
- Живем один раз! - Нет, мы умираем один раз. А живем мы каждый день.
#11 
Murr коренной житель17.06.09 21:22
Murr
NEW 17.06.09 21:22 
in Antwort AlexOtt 17.06.09 20:52
static int a;
------
Обратись к оригинальному вопросу - он несколько отличается от того,
об чем ты пытаешься написать.
производится одной командой
-----
Когда - одной, когда - несколькими, случается - запросом к системе -
все зависит от реализации...
которая просто уменьшает соответствующий указатель çтека
------
Насколько Я помню, есть системы где стек "растет" в другую сторону.
Кроме этого, есть системы в которых стек вообще не существует...
#12 
Murr коренной житель17.06.09 21:24
Murr
NEW 17.06.09 21:24 
in Antwort Kabal 17.06.09 20:56
Автоматические переменные, однако, спецом не инициализируются.
------
Перечитай вопрос. Там не про автоматические переменные, а про неполный
список инициализаторов.
#13 
  scorpi_ постоялец17.06.09 21:33
NEW 17.06.09 21:33 
in Antwort rahimov80 12.06.09 16:56, Zuletzt geändert 17.06.09 21:35 (scorpi_)
В ответ на:
А если у меня есть структура и я указал
struct myStr {
int a;
int b;
char* c;
} myStrVar = {0};

то какое значение будет у myStrVar.b; myStrVar.c ? Обнулится ли?


Да, обнулится:
В ответ на:

C99 (ISO/IEC 9899:1999) - 6.7.8 Initialization - 21
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
В ответ на:

C99 (ISO/IEC 9899:1999) - 6.7.8 Initialization - 10
If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:
- if it has pointer type, it is initialized to a null pointer;
- if it has arithmetic type, it is initialized to (positive or unsigned) zero;
- if it is an aggregate, every member is initialized (recursively) according to these rules;
- if it is a union, the first named member is initialized (recursively) according to these rules.
#14 
rahimov80 завсегдатай25.06.09 14:53
NEW 25.06.09 14:53 
in Antwort scorpi_ 17.06.09 21:33
Спасибо, _scorpi, всего два слова, которых я не знал:
В ответ на:
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate,
.
#15 
KwtH посетитель06.07.09 11:49
KwtH
NEW 06.07.09 11:49 
in Antwort Murr 17.06.09 21:22
В ответ на:
есть системы в которых стек вообще не существует..

просто интересно, какие?
автоматические переменные куда кладут тогда? в хип? если в хип, то как уберают? если не уберают, то пишут по верху когда места нет? а что тогда со статикой?
#16 
KwtH посетитель06.07.09 11:51
KwtH
NEW 06.07.09 11:51 
in Antwort alex_martirosov 17.06.09 10:33
а что, в С добавили уже конструкторы? как время бежит)))
#17 
Murr коренной житель06.07.09 15:26
Murr
NEW 06.07.09 15:26 
in Antwort KwtH 06.07.09 11:49
какие?
-----
Хммм... IBM360\370 устроит? Насколько Я помню - обходились без выделенного стека.
Правда, большинство языков использовавшихся на ней - не допускают рекурсии.

автоматические переменные куда кладут тогда?
-----
Выделяют, назначая базовый и индексный регистры. Детали - надо смотреть по конкретной
реализации.
пишут по верху когда места нет?
------
Там есть аппаратный контроль по дескриптору задачи...
а что тогда со статикой?
-----
С нею - проще всего - разок размещена и все... Правда загрузчик еще распишет выделенную
область специфическим кодом - для отслеживания неиспользованной памяти...
#18 
KwtH посетитель06.07.09 18:10
KwtH
NEW 06.07.09 18:10 
in Antwort Murr 06.07.09 15:26
ну как же, помню. я правда работал с советской серией ЕС, но это были копии ИБМ.
но вроде бы там стек был, по кр мере я так считал тогда))) может ошибаюсь, спорить не буду, на ассемблере работал только на ПК
возможно его организация была на низком уровне не такой как в ПК, но думаю что сути это не меняет.
#19 
Murr коренной житель06.07.09 20:10
Murr
NEW 06.07.09 20:10 
in Antwort KwtH 06.07.09 18:10
но вроде бы там стек был, по кр мере я так считал тогда
------
Там нет методов адресации используемых при работе со стеком.
на низком уровне не такой как в ПК
------
угу... 16 полностью равноправных 32-х-разрядных регистра...
на ассемблере работал только на ПК
------
Мне "не повезло" - с десяток различных аппаратных архитектур...
...и что еще хуже - обязательный курс построения процессоров
со всеми возможными извращениями в качестве лаб/курсовых...
#20 
1 2 alle