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

Каким образом getchar() меняет содержимое массива? - C++

Восстановить пароль Регистрация
 
FZ@8qQ
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 56
24.07.2013, 23:55     Каким образом getchar() меняет содержимое массива? #1
Здравствуйте!
Почему-то наличие getchar(); в коде влияет на содержимое массива. Если данный код не менять - то выводит правильный результат. Результат представлен на первом скрине. Если удалить первый getchar() с 21 строки, то в результате появляется абракадабра - представлено на втором скрине. Если удалить второй getchar(), то в результате вообще получаются нули - представлено на третьем скрине.

Мне по сути нужно, чтобы в массиве arr в конечном итоге содержался правильный результат, но getchar-ов быть не должно...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <iostream>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
using namespace std;
 
int main(int argc, char* argv[])
{
  int i, N=5, M=3;
 
  // Sozdaem i zapolnyarm pervii massiv arr
  int *arr = new int[N];
  for (i = 0; i < N; i++){
    arr[i] = i;
  }
getchar();
 
  // Sozdaem buf i kopiruem iz arr v buf to chto neobhodimo sohranit
  int *buf = new int[M];
  for (i = 0; i < M; i++){
    buf[i] = arr[i];
  }
getchar();
 
  // Udalyaem starii arr
  delete [] arr;
  // Sohranyaem buf s noivm imenem arr
  arr = buf;
  // Udalyaem buf
  delete [] buf;
 
  // Vivodim novii arr
  for (i = 0; i < N; i++){
    cout << arr[i] << endl;
  }
  getchar();
 
  // Udalyaem novii arr
  delete [] arr;
 
  return 0;
}
//---------------------------------------------------------------------------
P.S. Похоже не в ту тему написал, перенесите в обычный Cpp builder, если можно.
Миниатюры
Каким образом getchar() меняет содержимое массива?   Каким образом getchar() меняет содержимое массива?   Каким образом getchar() меняет содержимое массива?  

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11819 / 6798 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
25.07.2013, 00:09     Каким образом getchar() меняет содержимое массива? #2
UB, однако
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  delete [] arr;//Освободили память
 
  arr = buf;//Присвоили новый адрес
 
  delete [] buf;//Освободили память
 
 
  for (i = 0; i < N; i++){
    cout << arr[i] << endl;//arr указывает на освобожденную память (UB)
  }
  getchar();
 
delete [] arr;//Освобождение уже освобожденной памяти (UB)
FZ@8qQ
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 56
25.07.2013, 00:57  [ТС]     Каким образом getchar() меняет содержимое массива? #3
Честно сказать не понял Вас

Могли бы Вы еще ответить на такой вопрос:
Возможна ли такая организация в программе С++?

C++
1
2
3
Создаем глобальный динамический массив arr[M][N]
 
Работаем с arr в функциях
Одна из функций изменяет размер arr:
C++
1
2
3
4
5
void razmer(int M, int N){
  создается arr_bufer[M][N]
  arr = arr_bufer;
  удаляется arr_bufer;
}
Если таким образом не удастся изменить размер глобального массива, то тогда как это сделать?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 01:14     Каким образом getchar() меняет содержимое массива? #4
Цитата Сообщение от FZ@8qQ Посмотреть сообщение
Мне по сути нужно, чтобы в массиве arr в конечном итоге содержался правильный результат, но getchar-ов быть не должно...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int main(int argc, char* argv[])
{
  int i, N = 5, M = 3;
 
  // Sozdaem i zapolnyarm pervii massiv arr
  int *arr = new int[N];
  for (i = 0; i < N; i++)
       arr[i] = i;
 
  for (i = 0; i < N; i++)   // Vivodim arr
    cout << arr[i] << endl;
  
  // Sozdaem buf i kopiruem iz arr v buf to chto neobhodimo sohranit
  int *buf = new int[M];
  for (i = 0; i < M; i++)
       buf[i] = arr[i];
  
 
 // Udalyaem starii arr
  delete [] arr;
  // Sohranyaem buf s noivm imenem arr
  arr = buf;
  
  // Udalyaem buf
  //delete [] buf;
  
  cout << endl;
  
  // Vivodim novii arr
  for (i = 0; i < M; i++)
    cout << arr[i] << endl;
  
  // Udalyaem novii arr
  delete [] arr;
 
  return 0;
}
Миниатюры
Каким образом getchar() меняет содержимое массива?  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 01:24     Каким образом getchar() меняет содержимое массива? #5
!!!
Цитата Сообщение от FZ@8qQ Посмотреть сообщение
void razmer(int M, int N){
создается arr_bufer[M][N]
удаляется arr; !!!!
arr = arr_bufer;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11819 / 6798 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
25.07.2013, 02:23     Каким образом getchar() меняет содержимое массива? #6
Цитата Сообщение от FZ@8qQ Посмотреть сообщение
Честно сказать не понял Вас
Работа с динамической памятью рассматривается в каждом учебнике (надеюсь, что в каждом )
Берем, читаем, понимаем что код в первом посте является ошибочным, переделываем как положено

Добавлено через 2 минуты
Цитата Сообщение от FZ@8qQ Посмотреть сообщение
то тогда как это сделать?
Можно не изобретать свой велосипед, а задействовать давно проверенные средства. Например, vector из стандартной библиотеки C++
Flassie
181 / 166 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
25.07.2013, 04:04     Каким образом getchar() меняет содержимое массива? #7
Цитата Сообщение от FZ@8qQ Посмотреть сообщение
Честно сказать не понял Вас
C++
1
2
3
4
5
6
int *something = new int [1];
something[0] = 1;
int *example = something;
cout << "Before \"delete something\": " << example[0] << endl;
delete something;
cout << "After \"delete something\": " << example[0];
Может так легче будет понять
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 09:04     Каким образом getchar() меняет содержимое массива?
Еще ссылки по теме:

Каким образом реализуется квалификатор const? C++
Каким образом разархивировать gzip? C++
C++ Каким образом, содержимое заголовка может неоднократно подключиться в один файл исходного кода?

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
25.07.2013, 09:04     Каким образом getchar() меняет содержимое массива? #8

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Можно не изобретать свой велосипед
Полезно бывает, полезно.



Цитата Сообщение от FZ@8qQ Посмотреть сообщение
Если таким образом не удастся изменить размер глобального массива, то тогда как это сделать?
Создать новый массив, размером на одну ячейку большим, чем старый, и скопировать в него элементы старого массива.
Yandex
Объявления
25.07.2013, 09:04     Каким образом getchar() меняет содержимое массива?
Ответ Создать тему
Опции темы

Текущее время: 14:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru