c++ - 指针类型转换改变了意外的内存

标签 c++

#define ARRAY_SIZE 20

float DataSource[ARRAY_SIZE];

void Read(unsigned char const *Source, unsigned char *Destination, unsigned long DataSize)
{
  for ( unsigned long i = 0; i < DataSize; i++)
  {
    *(Destination + i*DataSize) = *(Source + i*DataSize);
  }
}

void fun()
{
  int Index;
  float Dest;

  for ( Index = 0; Index < ARRAY_SIZE; Index++ )
  {
    Read((unsigned char *)&DataSource[Index], (unsigned char *)&Dest, sizeof(DataSource[Index]));
  }
}

上面的代码在调用 Read() 时遇到问题,我的 Index 变量被覆盖,我确信丑陋的指针转换是罪魁祸首,但我无法准确理解这里发生的事情。

unsigned char 指针类型是强制性的,因为上面的代码是为了模拟一些驱动级软件并保持相同的原型(prototype)。

有人可以帮助我理解这里的问题吗?以上代码除了Read()的原型(prototype)外都是可以修改的。

最佳答案

错误在这里:

for ( unsigned long i = 0; i < DataSize; i++)
{
  //              vvvvvvvvvv               vvvvvvvvvv
  *(Destination + i*DataSize) = *(Source + i*DataSize);
}

i * DataSize 总是大于 i =>“越界”访问。

替换为:

for ( unsigned long i = 0; i < DataSize; i++)
{
  *(Destination + i) = *(Source + i);
}

关于c++ - 指针类型转换改变了意外的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14268142/

相关文章:

c++ - 为什么未初始化的指针会导致接近 0 的内存访问冲突?

c++ - 围绕显式模板实例化的困惑

c++ - 从派生友元函数调用 protected 函数

c++ - C++ 程序如何工作?

c++值和变量之间的不同打印行为

c++ - 使用 R 和 .C 返回点积

android - JNI 的 reinterpret_cast 的替代方案?

Android JNI ndk-构建错误 : 'jni' has not been declared

c++ - 如何验证 Internet 打印协议(protocol) (IPP)?

C++通过引用传递?