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

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

Восстановить пароль Регистрация
 
EvilGrif
0 / 0 / 0
Регистрация: 06.06.2014
Сообщений: 2
06.06.2014, 14:37     Изменение значения указателя #1
Здравствуйте
В коде приведена функция, которая при помощи указателей считывает размер массива и его элементы из файла блокнота. Почему значение, хранящееся в массиве после выполнения цикла самопроизвольно меняется?

функция мэйн

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";
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,957
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     Изменение значения указателя
Ответ Создать тему
Опции темы

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