偏移指针的正确方法是什么?

时间:2014-08-11 18:51:48

标签: c visual-studio

我正在将一些gcc C代码移植到msvc C,它通过简单地向指针添加一个整数来完成很多指针偏移:

memcpy(data+offset, uhus->elements[i], uhsize);

看起来VS2013中的C不会允许这样做。我记得在某个地方读过,在C中向一个指针添加一个整数,用i * sizeof(指针的数据类型)来偏移它,对于void *就像在上面的行中一样,但是在其他地方可能还有其他一些类型,因为软件适用于闪存固件,我宁愿在测试时避免使用我的设备。

目前我已经更换了这样的附加内容:

static void* ptrOffset(void* ptr, int offset) {
    return (void*)(((int)ptr) + offset);
}
memcpy(ptrOffset(data, offset), uhus->elements[i], uhsize);

应该诀窍,不是吗?

1 个答案:

答案 0 :(得分:3)

如果你真的想要一个辅助功能,那么正确的定义是:

void* ptrOffset(void* ptr, int offset) {
    return (char*)ptr + offset;
}

从技术上讲,不允许对void指针进行指针运算。另外,将指针转换为int将在64位平台上中断:你将丢失指针的前32位。