字符数组复制失败

时间:2015-01-19 02:33:40

标签: c++ arrays char

我正在复制一个数组,由于某种原因,复制后的值不一样。代码如下。在这两种情况下,_data变量都是char [4]。复制之后,断言触发。如果我检查调试器中的两个值,它们会显示为:0x00000000015700a80x00000000015700b0

_data[0] = rhsG->_data[0];

_data[1] = rhsG->_data[1];

_data[2] = rhsG->_data[2];

_data[3] = rhsG->_data[3];

assert(_data == rhsG->_data);

5 个答案:

答案 0 :(得分:2)

你错误地认为C ++是一种易于使用的高级语言(笑话)。 C风格数组上的operator ==比较了它们的地址,这当然在这里是不同的。您可以使用std::equal来比较两个数组,或使用支持更直观opeartor ==的其他数据结构,例如std::arraystd::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);