Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2013, 07:26   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию Выход за границы массива

Здравствуйте! У меня небольшой вопрос, можно ли считать это корректным кодом:
Код:
Type ar[3];
Type *p = &ar[4];

Type ar2[3];
Type *p2 = &ar2[-1];
220Volt вне форума Ответить с цитированием
Старый 30.06.2013, 08:31   #2
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Нет, не корректен.
220Volt вне форума Ответить с цитированием
Старый 30.06.2013, 10:18   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не корректен чем? минусом в индексе массива?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2013, 11:03   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Не исключаю того, что я поторопился с выводом. Рабочий код примерно такой:
Код:
#include <algorithm>

int main()
{
    int ar[5] = {1, 2, 3, 4, 5};
    auto p = std::lower_bound(ar, &ar[5], 7);   // &ar[5] - это нормально?
}
или правильней:
Код:
int main()
{
    int ar[5] = {1, 2, 3, 4, 5};
    int *end = &ar[4];
    ++ end;
    auto p = std::lower_bound(ar, end, 7);
}
P.S Знаю что можно использовать вектор и не париться

Последний раз редактировалось 220Volt; 30.06.2013 в 11:08.
220Volt вне форума Ответить с цитированием
Старый 30.06.2013, 14:26   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Здравствуйте! У меня небольшой вопрос, можно ли считать это корректным кодом:
Код:
Type ar[3];
Type *p = &ar[4];

Type ar2[3];
Type *p2 = &ar2[-1];
С точки зрения синтаксиса, код - корректен.
С точки зрения использования - зависит от целей автора.
Может быть автор ошибся, а может быть он знает что делает.

Вообще, у подобных конструкций есть своя область применения.
_Bers вне форума Ответить с цитированием
Старый 30.06.2013, 14:42   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Не исключаю того, что я поторопился с выводом. Рабочий код примерно такой:
Код:
#include <algorithm>

int main()
{
    int ar[5] = {1, 2, 3, 4, 5};
    auto p = std::lower_bound(ar, &ar[5], 7);   // &ar[5] - это нормально?
}
или правильней:
Код:
int main()
{
    int ar[5] = {1, 2, 3, 4, 5};
    int *end = &ar[4];
    ++ end;
    auto p = std::lower_bound(ar, end, 7);
}
P.S Знаю что можно использовать вектор и не париться
Я пишу так:

Код:
#include <iostream>    
#include <algorithm>

using namespace std;

int main()
{
    int ar[5] = {1, 2, 3, 4, 5};

    int* p = std::lower_bound(ar, ar+5, 7); 

    //мне кажется: arr+5 это короче, и читабельнее, проще понять
    //чем &arr[5]

    (p==ar+5)? (cout<<" p not found\n") : (cout<<"p="<<*p<<endl);

   //обрати внимание: lower_bound вернет &arr[5]
   //что бы просигналить: элемент не найден

}
Если тебя смущает факт взятия адреса элемента, которого как бы нет в массиве - не парься.

STL-функции часто оперируют понятием "адрес элемента идущего за последним элементом массива".

Например:

Код:
std::vector<int> vec;

vec.end(); //вернет итератор который указывает на элемент идущий за последним элементом вектора.
Твоя задача - прежде чем использовать получаемый итератор, сначала проверить - не является ли он за последним. И только убедившись - использовать.
_Bers вне форума Ответить с цитированием
Старый 30.06.2013, 15:36   #7
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Благодарю!
220Volt вне форума Ответить с цитированием
Старый 01.07.2013, 07:55   #8
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Небольшой тест, думаю по делу:
Код:
	volatile int *p = nullptr;
	cout<<*p;		// исключение
	cout<<&*p;		// ok, разыменование отсутствует
	cout<<&p[0];	// ok, разыменование отсутствует
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход за границы диапазона типа byte в Pascal Dianasobaka Помощь студентам 5 30.11.2012 14:06
Выход за границы массива weech Помощь студентам 8 30.04.2012 23:52
Паскаль. Выдёт ошибку "выход за границы диапазона" Winterfox Помощь студентам 1 04.12.2011 14:13
как указать границы массива? TotKtoNado БД в Delphi 3 18.08.2011 20:30
Ошибка "выход за границы диапазона" Luuun Помощь студентам 6 28.01.2010 22:39