#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变量被覆盖,并且我确定丑陋的指针强制转换是罪魁祸首,但是我无法准确了解此处发生的情况。

无符号字符指针类型是必需的,因为上面的代码旨在模拟某些驱动程序级别的软件并维护相同的原型。

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

最佳答案

错误在这里:

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/

10-11 22:42