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

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

Войти
Регистрация
Восстановить пароль
 
EvilGrif
0 / 0 / 0
Регистрация: 06.06.2014
Сообщений: 2
#1

Изменение значения указателя - C++

06.06.2014, 14:37. Просмотров 416. Ответов 3
Метки нет (Все метки)

Здравствуйте
В коде приведена функция, которая при помощи указателей считывает размер массива и его элементы из файла блокнота. Почему значение, хранящееся в массиве после выполнения цикла самопроизвольно меняется?

функция мэйн

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
#include <iostream>
#include <stdlib.h>
#include <windows.h>
 
using namespace std;
 
void notePadIn (int* nArray, int* nLength);
void arrayIn (int nArray[], int nLength);
void algorithm (int nArray[], int nLength);
 
 
main ()
{
    int nArrayLength = 0;
    int nArrayDate [nArrayLength];
    int* pArrayLength = &nArrayLength;
    int* pArrayDate = &nArrayDate[0];
//  cout << "Vvedite razmer massiva: ";
//  cin >> nArrayLength;
//  arrayIn (nArrayDate, nArrayLength);
    notePadIn (pArrayDate, pArrayLength);
    cout << "MAIN" <<"\n";
    cout << nArrayLength << "\n";
    for (int i = 0; i<nArrayLength; i++)
    {
        cout << nArrayDate [i] <<" ";
    }
 
//  algorithm (nArrayDate, nArrayLength);
проблемная функция

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
void notePadIn (int* pArray, int* pLength)
{
    freopen ("input.txt","r",stdin);
//  freopen ("output.txt","w",stdout);
    cin >> *pLength;
    
    COORD position;                                     //позаимствовал код. ставим курсор на вторую строку
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    position.X = 1;
    position.Y = 2;
    SetConsoleCursorPosition(hConsole, position);
    
    cout <<"Do cikla" <<"\n";
    cout <<"Adres razmera massiva: "<< pLength <<"\n"; 
    cout <<"Razmer massiva: "<< *pLength <<"\n";       //здесь значение равно 10, как надо
    cout <<"\n";
 
    for (int i = 0; i<*pLength; i++, pArray++)
    {
        cin >> *pArray;
        cout << "i: "<< i << "\n";
        cout <<"element: " <<*pArray <<"\n";
    }
    cout <<"\n";
    cout <<"Posle cikla" <<"\n";
    cout <<"Adres razmera massiva: "<< pLength <<"\n";
    cout <<"Razmer massiva: "<< *pLength <<"\n";    //здесь значение уже 6
    cout <<"\n";
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2014, 14:37     Изменение значения указателя
Посмотрите здесь:

Изменение значение указателя в цикле C++
C++ Изменение значения статической переменной
Изменение указателя - аргумента функции C++
C++ Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0]
C++ Изменение значения переменной во время исполнения
Инкрементальное увеличение значения указателя не работает C++
Изменение адреса указателя C++
Узнать тип значения, зная тип указателя C++
Изменение значения символа в строке C++
Изменение цвета точки в зависимости от значения температуры C++
C++ Изменение типа указателя
C++ Произвольное изменение значения на 0.000001

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Akelle
0 / 0 / 0
Регистрация: 06.06.2014
Сообщений: 5
06.06.2014, 16:33     Изменение значения указателя #2
Вы нигде не выделяете память под массив.
Должно быть так:
C++
1
2
3
4
5
  int nArrayLength = 0;
    int* nArrayDate = NULL;
    notePadIn (nArrayDate, &nArrayLength);
 ... 
if (nArrayDate != NULL) delete[] nArrayDate;
И в функции:
C++
1
2
3
4
5
6
7
void notePadIn (int* pArray, int* pLength)
{
    freopen ("input.txt","r",stdin);
//  freopen ("output.txt","w",stdout);
    cin >> *pLength;
   [B]pArray = new int[*pLength];[/B]
...
EvilGrif
0 / 0 / 0
Регистрация: 06.06.2014
Сообщений: 2
09.06.2014, 15:24  [ТС]     Изменение значения указателя #3
1) Но ведь я использую указатели на массив, инициализированный в main. Поэтому мне не обязательно выделять память под массив, инициализированный в функции, потому что через указатели я, по-сути, работаю с массивом в main.
2) Ваш ответ не объясняет почему значение указателя изменяется. Причем каждый раз после цикла оно равно 6, в не зависимости от введенных значений.

Добавлено через 1 минуту
1) Но ведь я использую указатели на массив, инициализированный в main. Поэтому мне не обязательно выделять память под массив, инициализированный в функции, потому что через указатели я, по-сути, работаю с массивом в main.
2) Ваш ответ не объясняет почему значение указателя изменяется. Причем каждый раз после цикла оно равно 6, в не зависимости от введенных значений.
Renji
1709 / 1142 / 270
Регистрация: 05.06.2014
Сообщений: 3,307
09.06.2014, 17:18     Изменение значения указателя #4
Почему значение, хранящееся в массиве после выполнения цикла самопроизвольно меняется?
Потому что за конструкции вида
C++
1
2
int nArrayLength = 0;
int nArrayDate [nArrayLength];
надо бить по рукам, если иное не оговорено ключом компилятора. Вы создали массив нулевого размера, попытались туда чего-то записать и получили переполнение стека с непредсказуемыми последствиями. Пользуйтесь std::vector. И поменяйте void notePadIn (int* nArray, int* nLength); на void notePadIn (int* nArray, int& nLength);
Yandex
Объявления
09.06.2014, 17:18     Изменение значения указателя
Ответ Создать тему
Опции темы

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