C ++:两个指针(据说是)到同一个地址。更改其中一个的内容不会更改另一个的内容

时间:2013-02-15 12:20:40

标签: c++ pointers arduino

我是C ++和arduino的新手,我不了解发生了什么。

问题是:

我有以下变量:

char *_array;
char _data[2];

当我这样做时:_array = data;然后我更改_data的内容,例如data[0] = 'C'data[1] = 'D'。 _array的内容不会改变,我需要再次_array = _data来应用更改。

似乎他们没有指向相同的地址。

下面的代码就是这样的例子,我的第三个印刷品应该是"3CD"而不是"3AB",但事实并非如此。

你能帮帮我吗?我不明白。谢谢!

#include <SoftwareSerial.h>
class Base {
    public:
        Base() {;};
        void setArray(char* array) {_array = array;}
        char *getArray() {return _array;}
    private:
        char *_array;
};

class A : public Base{
    public:
        A() : Base() {;};
        A(char data1, char data2)
        : Base()
        {
            setData(data1, data2);
            setArray(_data);
        }
        void setData(char data1, char data2)
        {
            _data[0] = data1;
            _data[1] = data2;
        }
        char *getData() {return _data;};

    private:
        char _data[2];
};

A a;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  a = A('A', 'B'); // This sets _data to "AB" and _array will point to _data
  Serial.write('1');
  Serial.write(a.getData()[0]);
  Serial.write(a.getData()[1]); // This will print "1AB" (as expected)

  a.setData('C', 'D'); // Here, _data changes to "CD" but _array no
  Serial.write('2');
  Serial.write(a.getData()[0]);
  Serial.write(a.getData()[1]); // This will print "2CD" (as expected)

  Serial.write('3');
  Serial.write(a.getArray()[0]);
  Serial.write(a.getArray()[1]); // This will print "3AB" (WHY?!?!?!)

  Serial.write('4');
  a.setArray(a.getData()); // If I call this function, _array changes to "CD"
  Serial.write(a.getArray()[0]);
  Serial.write(a.getArray()[1]); //This will print "4CD" (WHY I need to call setArray?)

  delay(3000);
}

2 个答案:

答案 0 :(得分:6)

a = A('A', 'B'); // This sets _data to "AB" and _array will point to _data

在上面一行中,A('A', 'B')构建了一个新的A并建立了内部_array。然后a = ...调用默认赋值,该赋值只将每个成员从源复制到目标。现在,a._array指向临时的char数组,这就是无效结果的来源。

为避免将来出现错误,

  • 实施赋值运算符
  • 复制构造函数
  • 并让默认构造函数初始化_array。

答案 1 :(得分:0)

您至少需要为类A编写复制构造函数和赋值运算符。默认副本将复制指针,而不是将其重新分配给新位置。

e.g。

A(A const& rhs) 
: Base(rhs)
{
    memcpy(_data, rhs._data, sizeof(_data));
    setArray(_data);
}


A& operator=(A const& rhs) 
{
    if (this != &rhs) {
        static_cast<Base&>(*this) = rhs;
        memcpy(_data, rhs._data, sizeof(_data));
        setArray(_data);
    }
    return *this;
}