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

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

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

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

06.06.2014, 14:37. Просмотров 487. Ответов 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";
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2014, 14:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Изменение значения указателя (C++):

Изменение типа указателя - C++
Вот допустим у меня есть два простейших класса, объекты которов занимают в памяти одинаковое количество памяти class prim { ...

Изменение адреса указателя - C++
Здравствуйте. Обращаюсь к форуму по следующему вопросу: как можно изменить значение указателя? То есть, есть следующий код: ...

Изменение указателя - аргумента функции - C++
Привет всем! Может я совсем тупой, но не могу понять почему не работает такой пример: #include &lt;iostream&gt; void func (char *...

Изменение значение указателя в цикле - C++
Добрый день! У меня возникла проблема следущего характера: в цикле for (i=0;i&lt;(n*n);i++) у меня сбивается указатель, тоесть при i=4,...

Инкрементальное увеличение значения указателя не работает - C++
Сразу скажу, что практической цели никакой нет, просто пытаюсь понять принцип работы изменения значения указателя. Есть такой код: ...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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]
...
0
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, в не зависимости от введенных значений.
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
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);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2014, 17:18
Привет! Вот еще темы с ответами:

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

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using namespace...

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.06.2014, 17:18
Ответ Создать тему
Опции темы

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