C++ : Two pointers (supposedly) to the same address. 改变其中一个的内容不会改变另一个的内容

标签 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);
}

最佳答案

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。

关于C++ : Two pointers (supposedly) to the same address. 改变其中一个的内容不会改变另一个的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14894637/

相关文章:

java - 静态类型是在编译时还是运行时强制执行的?

c++ - 为什么类模板的成员函数声明都应该是良构的?

c++ - C++ 对象中的堆栈成员与堆成员

c++ - PROGMEM 中的 Arduino 结构数组

c++ - 如何在Qt中为客户端-服务器程序编写SQLite

c++ - 在类构造函数中动态分配内存

C:为什么将 2D 整数数组分配给 int** 会导致 CLION 突出显示该行?

c - 如何读取 Ada 中的 C Void 指针?

c++ - 为什么没有转换为 Big Endian 的 Arduino(Little Endian)上的 Sha1 工作?

c++ - 在执行更复杂的程序时,Arduino UNO 意外循环串行