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

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

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

infinity размер - C++

17.09.2011, 17:00. Просмотров 1033. Ответов 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);   //всё ок и всё потом выводит, хотя должно быть переполнение?
....
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2011, 17:00     infinity размер
Посмотрите здесь:

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

Размер указателя - C++
sizeof(void*);// Размер указателя на любой тип равен 8, почему так много? И можно ли как-нибудь узнать сколько под указатель выделено...

размер класса - C++
Всем привет! Извините за нубский вопрос: как определить размер класса в режиме #pragma pack(1) и без него. (цитата из задания) ...

Размер стуктуры - C++
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; struct pol { char gop; char hop; int iop; ...

Размер стека - C++
Как узнать, какой размер размер стека использовала программа? Например, вот эта: #include &lt;iostream&gt; void print_seq(int x) { if...

размер числа - C++
Можно ли задать размерность числу? чтоб после запятой и перед ней было одинаковое количество цифр, отрицательные числа не были длиннее чем...

размер матрицы - C++
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;stack&gt; using namespace std; typedef vector&lt;int &gt; T_vec; typedef...

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

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

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

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

Добавлено через 19 секунд
Цитата Сообщение от talis Посмотреть сообщение
это не касается базовых типов с++
О чём и я
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.09.2011, 17:49     infinity размер #8
silent_1991, если человек действительно пришёл с билдера, и просто C++ раньше не занимался, он имеет весьма смутное представление о базовых типах, указателях и прочих "низкоуровневых основах", которые от него скрывали в vcl.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
17.09.2011, 17:55     infinity размер #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

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Меня вот что интересует. Удалось ли программе все таки изменить левые данные, т.е. ошибка вылезла после того, как была повреждена память?
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.09.2011, 17:56     infinity размер #10
Chelioss, да, это частенько при удалении вылазит.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
17.09.2011, 17:58     infinity размер #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Chelioss, да, это частенько при удалении вылазит.
Действительно, если убрать delete, то программа работает. Я был не прав.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.09.2011, 17:58     infinity размер #12
Цитата Сообщение от Chelioss Посмотреть сообщение
Меня вот что интересует. Удалось ли программе все таки изменить левые данные, т.е. ошибка вылезла после того, как была повреждена память?
Вставьте между пятой и седьмой строкой вызов MessageBoxA(). Если он не пройдёт - то до него дело не дошло и программа упала раньше.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2011, 18:02     infinity размер
Еще ссылки по теме:

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

Размер матрицы - C++
Люди, помогите пожалуйста! У меня есть задание: создать библиотеку функций для работы с матрицами. Можно ли сделать ,так что в...

Размер структуры? - C++
Здравствуйте, дорогие форумчане! Есть доп. зд - подсчитать размер структуры. Только я очень слабо понимаю где , что и как делать:wall: ...

Размер массива - C++
Здрасте. Такой вопрос.Можно ли каким то образом вывести число элементов массива,то есть его размер? Допустим int arr; Программа...

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


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

Или воспользуйтесь поиском по форуму:
borovik
209 / 203 / 1
Регистрация: 25.07.2010
Сообщений: 1,151
17.09.2011, 18:02  [ТС]     infinity размер #13
всё меня глючит это в с# всегда писало )

C#
1
2
3
  int[] a = new int[2];
            for (int i = 0; i < 6; i++)
                Console.WriteLine(a[i]);
System.IndexOutOfRangeException не обработано
Message=Индекс находился вне границ массива.
Yandex
Объявления
17.09.2011, 18:02     infinity размер
Ответ Создать тему
Опции темы

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