指针迭代问题

Pointer iteration issue

我尝试从分配的数组中迭代指针。

考虑这个例子:

let layout = Layout::array::<u32>(5).unwrap();

let mut ptr = alloc(layout) as *mut u32;

let base = ptr;

ptr = ptr.add(0);
*ptr = 10;
ptr = ptr.add(1);
*ptr = 100;
ptr = ptr.add(2);
*ptr = 200;
ptr = ptr.add(3);
*ptr = 300;
ptr = ptr.add(4);
*ptr = 400;


let a = *base.add(0);
let b = *base.add(1);
let c = *base.add(2);
let d = *base.add(3);
let e = *base.add(4);

结果是:

一:10 乙:100 c : 0 d:200 e : 0

我哪里弄错了,还是bug?

您正在设置以下值:

  • base.add(0) 通过 ptr.add(0)
  • base.add(1) 通过 ptr.add(1)
  • base.add(3) 通过 ptr.add(2)(在已经修改的指针上)
  • 等等:
ptr = ptr.add(0); // total offset =  0
*ptr = 10;
ptr = ptr.add(1); // total offset =  1
*ptr = 100;
ptr = ptr.add(2); // total offset =  3 <--- whoops!
*ptr = 200;
ptr = ptr.add(3); // total offset =  6 <--- undefined behavior!
*ptr = 300;
ptr = ptr.add(4); // total offset = 10 <--- further undefined behavior
*ptr = 400;

您要么需要保留原始指针,要么只使用 ptr.add(1) 前进到下一个位置。