Изменить указатель внутри класса - PullRequest
0 голосов
/ 01 мая 2020

У меня проблемы с манипулированием указателем внутри класса.

#include <iostream>

using namespace std;

class myClass {
public:
    void modifyPointer(float *pointer);
};

void myClass::modifyPointer(float *pointer) {
    pointer = new float[3];
    pointer[0] = 0;
    pointer[1] = 1;
    pointer[2] = 2;
    cout << "Address: " << pointer << endl;
}

int main()
{
    float* pointer;
    myClass object;
    object.modifyPointer(pointer);
    cout << "Address: " << pointer << endl;
    cout << "Values: " << pointer[0] << "," << pointer[1] << "," << pointer[2]
        << std::endl;

    return 0;
}

Когда я печатаю указатель внутри класса, я получаю его адрес, но в основной программе я получаю адрес 0 и ошибку сегмента при печати значений. В чем я не прав, как изменить этот указатель?

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

Указатели такие же, как и любые другие объекты. Передача объекта в качестве аргумента по значению создает копию этого объекта. Это означает, что оригинал pointer в main() остается неизменным. А поскольку он не подвержен влиянию и не инициализирован, доступ к массиву вне границ с pointer[any_index] приводит к неопределенному поведению . Вместо этого передайте по ссылке:

void modifyPointer(float*& pointer)
3 голосов
/ 01 мая 2020

Вы берете указатель за копию, поэтому вы не видите изменений в main. Вам нужно взять указатель по ссылке, например так:

void myClass::modifyPointer(float * &pointer) {
   pointer = new float[3];
   // ...
}

Конечно, вы должны также изменить объявление этой функции.

Вот рабочая демонстрация .

...