我正在复制一个数组,由于某种原因,复制后的值不一样。代码如下。在这两种情况下,_data变量都是char [4]。复制之后,断言触发。如果我检查调试器中的两个值,它们会显示为:0x00000000015700a8
和0x00000000015700b0
。
_data[0] = rhsG->_data[0];
_data[1] = rhsG->_data[1];
_data[2] = rhsG->_data[2];
_data[3] = rhsG->_data[3];
assert(_data == rhsG->_data);
答案 0 :(得分:2)
你错误地认为C ++是一种易于使用的高级语言(笑话)。 C风格数组上的operator ==
比较了它们的地址,这当然在这里是不同的。您可以使用std::equal
来比较两个数组,或使用支持更直观opeartor ==
的其他数据结构,例如std::array
或std::vector
。
然后,您可以使用他们的operator =
来复制它们,而不是每个元素一次复制,假设源和目标大小相同。如果它们不是std::copy
,或者它们必须是C风格的数组。
答案 1 :(得分:2)
如果与==比较,你只是比较两个指针,哪个值不同。如果要比较两个数组的相等性,可以使用memcmp()
assert( ! memcmp(_data, rhsG->_data, 4) );
答案 2 :(得分:2)
当你在assert“_data == rhsG-> _data”中使用operator ==时,_data和rhsG-> _data都是数组的地址。因此,在调试器中,0x00000000015700a8是_data的数组地址,0x00000000015700b0是rhsG-> _data的数组地址。显然,他们是不同的,然后断言火。 毕竟,数组名称始终是指向内存中第一个数组地址的指针。
答案 3 :(得分:1)
“_data == rhsG->_data
”不会比较两个数组的各个元素。
没有为数组定义“==
”运算符,因此这两个参数为decayed to pointers,==
可以工作。
答案 4 :(得分:0)
你的断言是比较两个不同阵列的地址,因为它们位于不同的内存位置。
如果你真的想要比较这些值,那么要么循环它们,要么使用memmp
。
assert(memcmp(_data, rhsG->_data, 4) == 0);