gpt4 book ai didi

c++ - memcpy 中的指针运算有奇怪的结果

转载 作者:太空宇宙 更新时间:2023-11-04 07:44:52 26 4
gpt4 key购买 nike

<分区>

几年后我又回到了 C 编程,所以我想我有点生疏了,但我发现我的代码中有一些奇怪的行为。

我有以下内容:

memcpy(dest + (start_position * sizeof(MyEnum)), source, source_size * sizeof(MyEnum));

地点:

  • destsource 是不同大小的 MyEnum 数组,
  • dest 是 64 字节长。
  • source 是 16 字节长。
  • sizeof(MyEnum)4 字节
  • source_size4,因为数组中有 4 个枚举。

我将此代码循环 4 次,每次都推进 start_position,因此在 4 次循环迭代中的每一次中,我都会使用以下值调用 memcpy(我已经用调试器检查过了):

  1. memcpy(dest + (0), source, 16);(start_position = 0 * 4,因为 source 大小为 4)
  2. memcpy(dest + (16), source, 16);(start_position = 1 * 4,因为 source 大小为 4)
  3. memcpy(dest + (32), source, 16);(start_position = 2 * 4,因为 source 大小为 4)
  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 上运行它,但据我所知,这应该无关紧要。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com