Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Выход за предел массива


Автор: Rockie 2.11.2006, 18:07
Здравствуйте. Просматривал http://forum.vingrad.ru/topic-119405.html с числами Фибоначчи, вспомнил что у самого есть старенькая программа. Запустил и не понял, почему "это работает". Объясните пожалуйста. Компилировал в BC 3.0 и в Билдере.

Код
#include<stdio.h>
#include<conio.h>

#define N 2                // два

int index, fibs[N];        

void main() {

fibs[0]=1;
fibs[1]=1;
printf("\n\n\n0 Fibonacci number = 1\n1 Fibonacci number = 1\n");

for(index=2;index<20;index++)   // двадцать
  { fibs[index]=fibs[index-1]+fibs[index-2]; // выход за предел массива
    printf("%d Fibonacci number = %d\n", index, fibs[index]);
  }
getch();
}

Автор: Kuvaldis 2.11.2006, 18:20
Rockie, 
Цитата

Запустил и не понял, почему "это работает".

Поэтому С++ и называют языком среднего уровня: можно многое, ответственность ложится на программиста.
Если не запортить какие-нибудь важные данные, которые записаны прямо за массивом на 2 элемента, то все будет хорошо.

Между прочим, Visual C++ тестит подобные ошибки, правда не на этапе компиляции, а как run-time error. Но все же..
Именно поэтому после написания мной программы в Builder я тестирую ее в Visual, так как последний - более строгий

Автор: dumb 2.11.2006, 19:01
Цитата(Kuvaldis @  2.11.2006,  18:20 Найти цитируемый пост)
Именно поэтому после написания мной программы в Builder я тестирую ее в Visual, так как последний - более строгий 

smile
или имееются ввиду программы класса "hello world"?

Автор: Kuvaldis 2.11.2006, 19:15
dumb, 
Цитата

или имееются ввиду программы класса "hello world"?

Это я сказал слишком общо:
имелось в виду, что тестируются блоки, файлы с логикой, т.е. те места, где не используются стандартные операции и GUI и наиболее высока вероятность ошибки (я еще не выжил из ума тестировать программу с VCL в Visual)

Сорри за не совсем корректно оформленную мыслю

Автор: Alexeis 2.11.2006, 21:29
Модератор: а язык кто укажет в заголовке?

Автор: Rockie 2.11.2006, 21:49
Kuvaldis, впнринцыпе за исключением последней функции это чистый Си. Мне было непонятно, почему нет никаких Access violation или подобного.. 

alexeis1, извиняюсь, забыл что в Центре Помощи

Автор: Kuvaldis 2.11.2006, 21:52
Rockie, 
это не Паскаль
Еще один классический пример из этой серии - использование функции gets()
Она читает в буфер входную строку до тех пор, пока не будет нажат Enter. И ей абсолютно по барабану, каков реальный размер буфера. И в общем случае при выходе за границу массива нет ни предупреждения, ни ошибки компиляции, ни ошибки времени выполнения

Таков С по стандарту. А в Visual уже реализация решения данной проблемы. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)