Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
borovik
209 / 203 / 1
Регистрация: 25.07.2010
Сообщений: 1,151
#1

infinity размер - C++

17.09.2011, 17:00. Просмотров 1054. Ответов 12
Метки нет (Все метки)

Вопрос почему при заданной размерности я могу добавлять бесконечно? Оо
C++
1
2
3
4
5
6
7
8
class stack{
private:
    int count;
    int *st;
public:
    stack(int n);
    void push(int n);
};
C++
1
2
3
4
5
6
7
8
stack::stack(int n){
    count = -1;
    st = new int[n]; 
}
void stack::push(int n){
    count++; 
    st[count] = n; 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int _tmain(int argc, _TCHAR* argv[])
{
    int t;
    cout<<"Размерность стека: ";
    cin>>t;
    stack MyStack(t); //допустим 2 
....
MyStack.push(3); 
MyStack.push(4); 
MyStack.push(7); 
MyStack.push(5);   //всё ок и всё потом выводит, хотя должно быть переполнение?
....
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2011, 17:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос infinity размер (C++):

Проверка double на NaN и Infinity - C++
Как лучше проверить дабл на нотенамбер или бесконечность?

Ввести размер массива с клавиатуры и передать этот размер в конструктор - C++
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и передать этот размер в конструктор, как мне это сделать? ...

Как вернуть NaN и Infinity, проверить на NaN и Infinity? - C++
Как вернуть NaN и Infinity, проверить на NaN и Infinity?

размер vector'a - C++
как узнать размер двумерного вектора отдельно по вертикали и горизонтали

Размер файла - C++
Как узнать размер файла в Си++/Си? кроме функции GetFileSize

Размер структуры - C++
Всем доброго дня! Не могу понять... Вот код. struct T { char i; int a; int b; int c; char j;

12
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.09.2011, 17:08 #2
Здесь ничего определённого сказать нельзя. Поведение не определено. Возможно, эта память будет затёрта без вашего ведома между заполнением и выводом стека.
0
borovik
209 / 203 / 1
Регистрация: 25.07.2010
Сообщений: 1,151
17.09.2011, 17:35  [ТС] #3
ну как так? я же выделил 2 индекса, а записал уже 3-4.
всегда же писала ошибку
"вы вылезли за индекс массива"
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.09.2011, 17:43 #4
borovik,

C++
1
2
3
4
void stack::push(int n){
        count++;        // count было равно 2. Стало 3
        st[count] = n;  // записываем туда, где должен был бы быть третий элемент массива
}
Машине глубоко всё равно, считаете ли вы кусок памяти по адресу &(st[3]) частью массива, или нет. Вы ей сказали - запиши туда, она туда и записала. Сами следите за тем, чтобы не вылазить за пределы массива.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.09.2011, 17:44 #5
borovik, когда это "всегда"? О_о
В С и С++ никогда выход за пределы статических-то массивов не проверялся, не то что динамических. Только метод at() класса std::vector проверяет индексы. А тут вы берёте указатель st и смещаетесь относительно него на 1, 2, 3 и т.д. размера типа int. Что компилятор тут может определить, когда он даже не знает, что st указываете на массив, а не на одиночный элемент.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.09.2011, 17:47 #6
Цитата Сообщение от borovik Посмотреть сообщение
всегда же писала ошибку
"вы вылезли за индекс массива"
Вы раньше на билдере писали, да?

silent_1991, в билдере перехватывается out-of-range exception, которое выбрасывается объектами его типов, и выводится сообщение.

Добавлено через 1 минуту
Хотя это не касается базовых типов с++.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.09.2011, 17:48 #7
talis, да, но тут-то речь идёт даже не о массиве, а об указателе. Как же на него можно расширять понятия объектов и исключений?

Добавлено через 19 секунд
Цитата Сообщение от talis Посмотреть сообщение
это не касается базовых типов с++
О чём и я
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.09.2011, 17:49 #8
silent_1991, если человек действительно пришёл с билдера, и просто C++ раньше не занимался, он имеет весьма смутное представление о базовых типах, указателях и прочих "низкоуровневых основах", которые от него скрывали в vcl.
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
17.09.2011, 17:55 #9
Visual Studio 2008
Не знаю, срабатывает ли ошибка во времени выполнения всегда, но вот пример, когда срабатывает:
C++
1
2
3
4
5
6
7
8
9
int main()
{
    int *st = new int[2];
    st[2] = 5;
    st[3] = 1;
 
    delete [] st;
    return 0;
}
ОС Windows инициировала точку останова в Exemple.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в Exemple.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит Exemple.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Меня вот что интересует. Удалось ли программе все таки изменить левые данные, т.е. ошибка вылезла после того, как была повреждена память?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.09.2011, 17:56 #10
Chelioss, да, это частенько при удалении вылазит.
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
17.09.2011, 17:58 #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Chelioss, да, это частенько при удалении вылазит.
Действительно, если убрать delete, то программа работает. Я был не прав.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.09.2011, 17:58 #12
Цитата Сообщение от Chelioss Посмотреть сообщение
Меня вот что интересует. Удалось ли программе все таки изменить левые данные, т.е. ошибка вылезла после того, как была повреждена память?
Вставьте между пятой и седьмой строкой вызов MessageBoxA(). Если он не пройдёт - то до него дело не дошло и программа упала раньше.
1
borovik
209 / 203 / 1
Регистрация: 25.07.2010
Сообщений: 1,151
17.09.2011, 18:02  [ТС] #13
всё меня глючит это в с# всегда писало )

C#
1
2
3
  int[] a = new int[2];
            for (int i = 0; i < 6; i++)
                Console.WriteLine(a[i]);
System.IndexOutOfRangeException не обработано
Message=Индекс находился вне границ массива.
0
17.09.2011, 18:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2011, 18:02
Привет! Вот еще темы с ответами:

Размер файла - C++
Скрипт, который находит размер всех файлов указанного типа на указанном диске.(можно и 1 файла) вот мне нада узнать размер D:\1.txt

Размер шрифта в C++ - C++
Возникла проблема при изменения рифта, а точнее не могу понять как. Нужно изменить размер шрифта на полужирный когда пользователь вводит...

Размер программа - C++
У меня есть программа которая допустим вычисляет квадратный корень из числа. мне приходиться тянуть cmath из-за этого увеличивается...

Размер байта - C++
Есть ли он в std::numeric_limits? Гарантирует ли стандарт какому либо типу разрядность 1 байт?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru