指针。读取访问违规 – 为什么?

我有一个函数,它可以在两个变体中调用,第一个变体工作正常,但第二个变体给出了一个读取访问违规。

不知何故,我没有看到一个错误,你看到一个错误吗?

谢谢你

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 以及除了这可能不是你想要的。

给TA打赏
共{{data.count}}人
人已打赏
未分类

我想把导航项Sign up移到右边,我试过ml-auto和justify-content-end,但它没有移动。

2022-9-9 2:34:19

未分类

通过向左或向右滑动来管理Offset的dx。

2022-9-9 2:34:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索