我有一个函数,它可以在两个变体中调用,第一个变体工作正常,但第二个变体给出了一个读取访问违规。
不知何故,我没有看到一个错误,你看到一个错误吗?
谢谢你
void doSth(uchar *ptr, uint size, bool variant_one)
{
uchar *buffer = new uchar[size];
// Works
if(variant_one) {
for(uint i=0; i<size; i++) {
buffer[i] = (*(ptr+1));
ptr = ptr+2;
}
}
else {
uint16_t* ptr16 = (uint16_t*) &ptr;
for(uint i=0; i<size; i++) {
buffer[i] =(uchar) *(ptr16)>>4; // Gives Read Access Violation
ptr16++;
}
}
}
uint16_t* ptr16 = (uint16_t*) &ptr;
你重新解释 ptr
作为指向 uint16_t
但该地址不存在这样的对象。试图访问不存在的对象会导致未定义的行为(至少在C++20之前是这样;它在某些情况下引入了隐式创建琐碎对象的功能)。
uint16_t* ptr16 = (uint16_t*) &ptr;
for(uint i=0; i<size; i++) {
buffer[i] =(uchar) *(ptr16)>>4;
ptr16++;
假设 uchar
是8位宽的类型,不可能让一个数组的 size
8位对象将适合 size
16位对象的数量。你会溢出数组。
编辑: 如果你写的是 (uint16_t*) ptr;
这就更有意义了,尽管还是破绽百出。以上所有内容仍然适用于 &ptr
以及除了这可能不是你想要的。