Страниц: [1]
  Печать  
Автор Тема: Инициализация переменных  (Прочитано 6131 раз)
olegus
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Октября 02, 2002, 02:40:00 pm »

На конференции которая проходила в Питере, я обратил внимание во время демонстрации отладчика на следующий факт:
Демонстрировался работа отладчика на примерно следующем коде

 main()
  {
    int i;
   
    for (i=10; i<20; i++)
     {

}
  }

фишка в том, что после объявления переменной, отладчик сразу присвоил ей значение 0 (ноль).
Подумав что это ошибка отладчика, я не обратил на это внимание... но приехав домой я решил еще раз разобраться в этом.
Написав следующий код:

int i1;

main()
 {
  int i2;

  printf ("%d
%d
",i1,i2);
 }

Скомпилив программу, она мне выдала результат два нуля.
В тоже время допустим под линуксом обнуляется только глобальная переменная.
Вопрос, на сколько корректна в данном случае работа QNX?
Записан
Landy
Jr. Member
**
Offline Offline

Сообщений: 65


Просмотр профиля WWW
« Ответ #1 : Октября 02, 2002, 02:56:00 pm »


Скомпилив программу, она мне выдала результат два нуля.
В тоже время допустим под линуксом обнуляется только глобальная переменная.
Вопрос, на сколько корректна в данном случае работа QNX?

Я думаю - некорректно - это дело случая , попал на область памяти иницилизированную 0
Был такой случай - пришли ко мне и говорят - вот программа не работает на x86, а на VMS работает
Дело было как раз в том, что не инициализировали переменные 0 на х86
На VMS (официально признана по С-2 в сетях)  память принудительно инитится 0 при завершении процесса, на х86 такого нет
Поэтому перекомпилированная программа на х86 иногда работала, а иногда нет
Записан
olegus
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #2 : Октября 02, 2002, 03:00:00 pm »


Landy пишет:

Скомпилив программу, она мне выдала результат два нуля.
В тоже время допустим под линуксом обнуляется только глобальная переменная.
Вопрос, на сколько корректна в данном случае работа QNX?

Я думаю - некорректно - это дело случая , попал на область памяти иницилизированную 0

И так 10 раз подряд
Если серьезно, я менял сам пример, но переменная всегда была нулевой -(.
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #3 : Октября 02, 2002, 03:11:00 pm »

Локальные переменные выделяются на стеке, и стандарт ANSI C++, по крайней мере, не требует их инициализации. Если же они инициализируются - то это тоже не ошибка, а некоторое ... удобство, что ли, для разработчика. Но закладываться на такое поведение - это явно нарабатывать непереносимость, об чём говорилось выше.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #4 : Октября 02, 2002, 04:35:00 pm »

По-моему тоже все нормально, может это просто особенность загрузчика эльфов чистить память на начальном этапе ...

Вот код:


#include <stdio.h>

int i1;

void main()
{
  int i2;
 
  printf("%d, %d
", i1, i2);
}


При переводе в асм, получаем


   .file   "ints.c"
   .version   "01.01"
gcc2_compiled.:
.section   .rodata
.LC0:
   .string   "%d, %d
"
.text
   .align 4
.globl main
   .type    main,@function
main:
   pushl %ebp
   movl %esp,%ebp
   subl ,%esp
   addl $-4,%esp
   movl -4(%ebp),%eax
   pushl %eax
   movl i1,%eax
   pushl %eax
   pushl $.LC0
   call printf
   addl ,%esp
.L2:
   leave
   ret
.Lfe1:
   .size    main,.Lfe1-main
   .comm   i1,4,4
   .ident   "GCC: (GNU) 2.95.3 20010315 (release)"


Чистки нигде нет, компилятор значит не модифицирован, следует, что при работе вдальнейшем такие переменные будут содержать мусор ...
Записан

Страниц: [1]
  Печать  
 
Перейти в: