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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2010, 16:28   #1
@Manya@
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 17
По умолчанию Указатели

Имеется некоторая функция. Она выглядит вот так
Код:
int *remain(int const * const p, int len1, int const * const p22, int len2, int *rem, int &len3){
	int *p1 = new int [len1];
	int *p2 = new int [len2];
	int k= len1-1; 
	for (int i=0; i<len1; i++)
		p1[i] = p[i];
	for (int i=0; i<len2; i++)
		p2[i] = p22[i];
	for (int i=0; i<len1/2; i++)
	{
		int temp = p1[i];
		p1[i] = p1[k-i];
		p1[k-i] = temp;
	}
   k = len2-1;
   for (int i=0; i<len2/2; i++)
   {
      int temp = p2[i];
      p2[i] = p2[k-i];
      p2[k-i] = temp;
   }
   int *ptr1;
   ptr1= p1;
   while (len1>=len2)
   {
      int del = (int)(*ptr1/ *p2);
      for (int i=0; i<len2; i++)
         *(ptr1+i) -= del * p2[i];
      len1--;
      ptr1++;
   }
   rem = ptr1;
   len3 = len1;
   delete [] p1;
   return rem;
}
Она работает верно, как положено, НО... Если смотреть в отладчике, до строки return rem; , rem имеет какое-то определенное нормально значение, а как только из функции выходит, то это значение теряется и rem( я имею ввиду возвращаемое значаение в main, то есть то, которое в main, оно тоже называется rem) выглядит так, будто бы и не были в функции. Что не так?

Последний раз редактировалось @Manya@; 16.05.2010 в 16:59.
@Manya@ вне форума Ответить с цитированием
Старый 16.05.2010, 19:49   #2
@Manya@
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 17
По умолчанию

причем, если добавить в конце delete [] p2;, то удаляется все, что было в rem, но так быть не должно. Значит, p2 и rem в этот момент имеют одинаковые значения адреса. А вот как это исправить, не знаю
@Manya@ вне форума Ответить с цитированием
Старый 16.05.2010, 20:51   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
   ptr1= p1;
   while (len1>=len2)
   {
      //...
      ptr1++;
   }
   rem = ptr1;
   delete [] p1;
   return rem;
Как это работает. ptr1 указывает на начало массива p1. Затем ptr1 где-то гуляет по массиву, но всегда остается внутри массива p1. Затем rem указывает на ту позицию внутри p1, на которой остановился ptr1. Затем мы освобождаем всю память, выделенную для p1, в том числе и ту ее область, куда указывает rem. А стало быть, теперь rem указывает на совершенно неуправляемую нами область памяти.
Если я правильно понял суть, то вам надо куда-то копировать нужный вам фрагмент p1, а затем возвращать указатель на этот массив, в который вы скопировали.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 16.05.2010, 21:26   #4
@Manya@
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 17
По умолчанию

Спасибо Вам большое.
Только что-то я не понимаю 1 вещь. Если завести еще 1 массив, то будет происходить тоже самое, что и было,а тут еще rem будет указывать на некоторую локальную переменную из функции(
@Manya@ вне форума Ответить с цитированием
Старый 17.05.2010, 13:53   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Нет, rem будет указывать не на локальную переменную, а на область памяти. Поскольку эта область памяти выделена с помощью оператора new, то по выходе из функции она не будет освобождена и все данные, содержащиеся в ней, будут по-прежнему доступны по соответствующему указателю. Да, указатель rem является локальной переменной, и будет уничтожен по выходе из функции, но его значение (т.е. адрес области памяти) будет передано через return какому-то другому указателю, и теперь эта все еще валидная область памяти может быть доступна по этому новому указателю. Но, конечно же, в конце концов надо будет ее освободить, применив operator delete, передав ему в качестве аргумента текущий указатель.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели С++ MarihuanaP Помощь студентам 1 09.02.2010 17:06
указатели Артэс Общие вопросы C/C++ 11 07.02.2010 16:47
Указатели IceBreaker Общие вопросы C/C++ 9 05.02.2010 09:11
Указатели Paul_AG Общие вопросы C/C++ 5 03.07.2009 14:22
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39