Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Локальные копии переменных


Автор: reddevil 4.7.2005, 00:21
Люди!
Есть вопрос, почему Функция, изменяет значение в масиве,
а не делает локальную копию?
вот пример:
Код

#include "stdafx.h"

using namespace std;

void resize(int []);

int _tmain(int argc, _TCHAR* argv[])
{
    int x[2]={5,10};
    
    cout<<"before in main:\n";
    cout<<"x0: "<<x[0]<<"\tx1: "<<x[1]<<endl;
    resize(x);
    cout<<"after in main:\n";
    cout<<"x0: "<<x[0]<<"\tx1: "<<x[1]<<endl;


    return 0;
}

void resize(int y[])
{
    cout<<"in resize, before resize:\n";
    cout<<"x0: "<<y[0]<<"\tx1: "<<y[1]<<endl;
    y[0]=10;
    y[1]=5;
    cout<<"in resize, after resize:\n";
    cout<<"x0: "<<y[0]<<"\tx1: "<<y[1]<<endl;
}


Автор: sergejzr 4.7.2005, 01:27
Потому что ты передал ей указатель на этот массив. Вот указатель и скопировался smile А сам массив остался там, где и был smile

Автор: reddevil 4.7.2005, 08:21
Если я правильно понимаю, то имя массива и есть указатель smile на него?
Тогда как объявить локальную копию, чтоб при выходе из функции массив
остался целым? smile

Автор: En_t_end 4.7.2005, 10:18
Во первых поставить квалификатор const("resize(const int y[])") - с этим компилятор убережет тебя если что... и просто в коде перед началом испольхования создать цикл присваивания типа токого:
for(unsigned long i = 0; i < sizeof(massiv); i++)
new_massiv[i] = massiv[i];
Здесь не происходит копирования адрессов, а происходит копирования значений, так как [] - это аналог разыменования *.
Этот способ так себе... потому что по-ламерски... (с приминением новых переменных)

Если в духе СИ, то можно написать так while(*massiv++ = *new_massiv++){} //ИМХО(за правильность не ручаюсь, сам пробывал раз - вроде за границы massiv не вылазиет, следовательно возрвращает эта операция значение BOOL)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)