【发布时间】:2019-09-15 06:01:41
【问题描述】:
几年后我又回到了 C 编程领域,所以我想我有点生疏了,但我在我的代码中看到了一些奇怪的行为。
我有以下:
memcpy(dest + (start_position * sizeof(MyEnum)), source, source_size * sizeof(MyEnum));
地点:
-
dest和source是MyEnum大小不同的数组, -
dest的长度为 64 个字节。 -
source的长度为 16 个字节。 -
sizeof(MyEnum)是4字节 -
source_size是4,因为数组中有 4 个枚举。
我循环这段代码 4 次,每次都推进 start_position,所以在 4 次循环迭代中的每一次,我都会使用以下值调用 memcpy(我已经用调试器检查过这个):
-
memcpy(dest + (0), source, 16);(start_position= 0 * 4,因为source的大小为 4) -
memcpy(dest + (16), source, 16);(start_position= 1 * 4,因为source大小为 4) -
memcpy(dest + (32), source, 16);(start_position= 2 * 4,因为source的大小是 4) -
memcpy(dest + (48), source, 16);(start_position= 3 * 4,因为source的大小是 4)
memcpy 在第一个循环中运行良好,但在第二个循环中它将数据复制到另一个数组,显然超出了dest 数组的内存区域,侵犯了另一个数组的内存区域。
所以我检查了函数内部发生的指针运算,这就是我得到的:
-
dest地址是0xbeffffa74 -
dest + (start_position * sizeof(MyEnum))是0xbefffab4对于(start_position * sizeof(MyEnum)=16 - 被违反的数组位于
0xbefffab4。
虽然这解释了数组内存被侵犯的原因,但我不知道0xbeffffa74 + 16 将如何变为0xbefffab4,但我可以确认这是调用memcpy 的地址。
我在 Raspberry Pi 上运行它,但 AFAIK 这应该没关系。
【问题讨论】:
标签: c++ c arrays pointers pointer-arithmetic