Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
FZ@8qQ
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 56
#1

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

24.07.2013, 23:55. Просмотров 442. Ответов 7
Метки нет (Все метки)

Здравствуйте!
Почему-то наличие 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, если можно.
0
Миниатюры
Каким образом getchar() меняет содержимое массива?   Каким образом getchar() меняет содержимое массива?   Каким образом getchar() меняет содержимое массива?  

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2013, 23:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Каким образом getchar() меняет содержимое массива? (C++):

Каким образом, содержимое заголовка может неоднократно подключиться в один файл исходного кода? - C++
В книге написано, что для предотвращения многократного включения содержимого заголовка, нужно использовать переменную препроцессора. Хочу...

Пробел в старшем и младшем байте массива. Каким образом?! - C++
Здравствуйте форумчане! Решил сделать задачку по с++, но столкнулся с проблемой: Нужно заполнить двумерный массив символами и написать...

Каким образом vector (STL, C++11/14) удаляет элементы из внутреннего массива? - C++
Судя по отладчику, для объекта не просто вызывается деструктор при вызове pop_back(). Объект также пропадает, если смотреть над доступные...

Массив: каким образом можно изменить размер многомерного массива - C++
Я на 100% уверен что вопрос неоднократно поднимался до меня, поэтому заранее прошу прощения за эту тему.. Я просто ни как не могу найти...

Каким образом лучше осуществить вывод массива с помощью графики? - C++
Добрый день! Имеется массив размера примерно 1000 на 500. Некоторые ячейки закрашенные, некоторые нет. Каким образом лучше осуществить...

GUI - каким образом лучше - C++
Подскажите как лучше реализовать GUI (в VS 2012 если быть точнее), слышал я что есть MFS как бы он вроде предназначен для создания GUI но...

7
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
25.07.2013, 00:09 #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)
1
FZ@8qQ
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 56
25.07.2013, 00:57  [ТС] #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;
}
Если таким образом не удастся изменить размер глобального массива, то тогда как это сделать?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 01:14 #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;
}
1
Миниатюры
Каким образом getchar() меняет содержимое массива?  
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 01:24 #5
!!!
Цитата Сообщение от FZ@8qQ Посмотреть сообщение
void razmer(int M, int N){
создается arr_bufer[M][N]
удаляется arr; !!!!
arr = arr_bufer;
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
25.07.2013, 02:23 #6
Цитата Сообщение от FZ@8qQ Посмотреть сообщение
Честно сказать не понял Вас
Работа с динамической памятью рассматривается в каждом учебнике (надеюсь, что в каждом )
Берем, читаем, понимаем что код в первом посте является ошибочным, переделываем как положено

Добавлено через 2 минуты
Цитата Сообщение от FZ@8qQ Посмотреть сообщение
то тогда как это сделать?
Можно не изобретать свой велосипед, а задействовать давно проверенные средства. Например, vector из стандартной библиотеки C++
0
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
25.07.2013, 04:04 #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];
Может так легче будет понять
1
SatanaXIII
Супер-модератор
Эксперт С++
5619 / 2654 / 247
Регистрация: 01.11.2011
Сообщений: 6,552
Завершенные тесты: 1
25.07.2013, 09:04 #8

Не по теме:

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



Цитата Сообщение от FZ@8qQ Посмотреть сообщение
Если таким образом не удастся изменить размер глобального массива, то тогда как это сделать?
Создать новый массив, размером на одну ячейку большим, чем старый, и скопировать в него элементы старого массива.
1
25.07.2013, 09:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 09:04
Привет! Вот еще темы с ответами:

Каким образом разархивировать gzip? - C++
Здравствуйте, имеется буфер (ответ сервера на запрос), заархивированный в gzip (в заголовке - Content-Encoding: gzip) Требуется его...

Каким образом легче выучить c++ - C++
Как легче понять и выучить язык с++

Каким образом зашифровать Hex строки - C++
Интересует следующий вопрос, каким образом можно зашифровать hex строку в dll чтобы ее нельзя было расшифровать. Сам в прикладном...

Каким образом параметры передаются в функцию? - C++
Задумался над тем, каким образом параметры передаются в функцию. Т.е. как именно это происходит внутри, это уже на вопрос к тому, как...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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