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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2015, 14:07   #1
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию С++ помогите найти ошибку

есть код
Код:
#include <iostream.h>

int main(){
int x = 1;	
int &pnt = x; 
int z = pnt;
cout << "X = " << x
	 << "\npnt = " << pnt
	 << "\n&pnt = " << &pnt //узнать адрес ссылки
	 << "\nZ = "<< z ;

int array[] = {4, 5 , 6}; 
int *ptra;
ptra = array;
cout << "\n\n\nptra = " << ptra  //содержимое ptra
	 << "\n&ptra = " << &ptra //адрес самого указателя
	 << "\n*ptra = " << *ptra; //разыменовывание указателя = 4
ptra = ptra + 1;// *ptr указывает на array[1]
cout << "\n\nptra = " << ptra
	 << "\n&ptra = " << &ptra 
	 << "\n*ptra = " << *ptra ;// = 5

int b[5] = {5,4,3,2,1}, *bPtr, *temp;
bPtr = &b[0];// bPtr присвоить ссылку на b[0]
*temp = *bPtr + 3;	//сложить b[0] и 3
cout << "\n\n\ntemp = " << temp
	 << "\n&temp = " << &temp
	 << "\n*temp = " << *temp // = 8
	 << "\nb[0] = " << b[0];

temp = bPtr + 3;	// указать на элемент массива b[3]
cout << "\n\ntemp = " << temp
	 << "\n&temp = " << &temp
	 << "\n*temp = " << *temp // = 2
	 << "\nb[3] = " << b[3];

*temp = *(b + 1); // ссылка на элемент b[1]
cout << "\n\ntemp = " << temp
	 << "\n&temp = " << &temp
	 << "\n*temp = " << *temp // = 4
	 << "\nb[1] = " << b[1]
	 << "\nb[0] = " << b[0];
cout << "\n\nbPtr[4] = " << bPtr[4] << endl; //тоже самое как b[4]
system("pause");
}
Он работает, но
Если int array[] = {4, 5 , 6}; заменить на int array[] = {4, 5 , 6, 7};
то подсвечивается строка
*temp = *bPtr + 3;
лог: First chance exception at $00401417. Exception class $C0000005 with message 'access violation at 0x00401417: write of address 0x0041bc03'. Process Project1.exe (2272)
Если написать int array[] = {4, 5 , 6, 7, 8};
то снова всё работает.
Как связаны array[], *temp, *bPtr почему появляется ошибка?
пишу в RAD Studio Borland C++ XE3.
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 08.01.2015, 15:49   #2
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

У меня выбило ошибку здесь( borland builder 6 ):
Код:
*temp = *bPtr + 3;
Прежде указателю temp надо выделить память( например ):
Код:
temp = new int[3];
*temp = *bPtr + 3;
igoreshka3333 вне форума Ответить с цитированием
Старый 08.01.2015, 23:12   #3
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

Цитата:
У меня выбило ошибку здесь( borland builder 6 ):
Код:


*temp = *bPtr + 3;

Прежде указателю temp надо выделить память( например ):
Код:


temp = new int[3];
*temp = *bPtr + 3;
Спасибо, помогло :
Код:
temp = new int;
Ещё если задать размер массива
Код:
int array[4] = {4, 5 , 6, 7};
то всё работает, но думаю это не совсем решение проблемы.
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 09.01.2015, 00:05   #4
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Цитата:
то всё работает, но думаю это не совсем решение проблемы.
Проверь - попробуй выполнить программу построчно!
Обьявляешь и инициализируешь массив
Код:
int array[] = {4, 5 , 6};
Идешь дальше, выделяешь память, присваиваешь
Код:
temp = new int[3];
*temp = *bPtr + 3;
все нормально вроде....
igoreshka3333 вне форума Ответить с цитированием
Старый 09.01.2015, 13:43   #5
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

Как вы и написали, верное решение проблемы - выделение памяти под указатель temp, а размер массива array[] тут не причём. Ещё раз спасибо.
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти седловые точки в матрице(помогите найти ошибку) - pascal tdsotm Помощь студентам 0 20.11.2014 18:57
Помогите найти ошибку - StrToFloat выдаёт ошибку EConvertError для ячеек StringGrid (Delphi) Artsiom Помощь студентам 10 18.12.2013 14:10
Помогите найти ошибку lubafffka Паскаль, Turbo Pascal, PascalABC.NET 1 18.12.2008 09:42
Помогите найти ошибку Рената Паскаль, Turbo Pascal, PascalABC.NET 2 05.01.2008 04:29