C++ 缓冲区强制转换后的值无效

C++ 缓冲区强制转换后的值无效,c++,C++,我需要在我的程序中以不同的类型存储大量数据,所以我使用字节缓冲区,将其转换为正确的类型。一般来说,它可以工作,但我更改了一些代码,它会随机崩溃。例子应该说明更多 // buffer.cpp uint8_t buffer[750]; // buffer.h extern uint8_t buffer[750]; // my_file.cpp void printFunction() { uint8_t* x = &pamiec[calibration[1].ile_pam

我需要在我的程序中以不同的类型存储大量数据,所以我使用字节缓冲区,将其转换为正确的类型。一般来说,它可以工作,但我更改了一些代码,它会随机崩溃。例子应该说明更多

// buffer.cpp
uint8_t buffer[750];

// buffer.h
extern uint8_t buffer[750];

// my_file.cpp
 void printFunction()
 {
     uint8_t* x = &pamiec[calibration[1].ile_pamiec];
     auto xx = (Datetime*)((void*)x);
     printf("%u\n", calibration[1].ile_pamiec == 20);

     dummyWorking(xx);
     dummyUnworking(xx);
 }

void dummyWorking(Datetime* xx)
{
    uint8_t* ap = &pamiec[20];
    *(reinterpret_cast<uint16_t*>(ap)) = 513;

    printf("%u ", ap==(uint8_t*)xx);
    printf("%u %u %u\n", *ap, *(ap + 1), *((uint16_t*)ap));
}

void dummyUnworking(Datetime* xx)
{
    uint8_t w = (uint8_t)calibration[1].ile_pamiec;
    uint8_t* apb = &pamiec[w];
    *(reinterpret_cast<uint16_t*>(apb)) = 513;
    
    printf("%u ", apb==(uint8_t*)xx);
    printf("%u %u %u", *apb, *(apb + 1), *(reinterpret_cast<uint16_t*>(apb)));
 }
 
//buffer.cpp
uint8_t缓冲器[750];
//缓冲区
外部uint8_t缓冲区[750];
//my_file.cpp
void printFunction()
{
uint8_t*x=&pamiec[校准[1].ile_pamiec];
自动xx=(日期时间*)((无效*)x);
printf(“%u\n”,校准[1].ile\u pamiec==20);
dummyWorking(xx);
dummyUnworking(xx);
}
无效dummyWorking(日期时间*xx)
{
uint8_t*ap=&pamiec[20];
*(重新解释铸造(ap))=513;
printf(“%u”,ap==(uint8_t*)xx);
printf(“%u%u%u\n”、*ap、*(ap+1)、*((uint16_t*)ap));
}
无效未加工(日期时间*xx)
{
uint8_t w=(uint8_t)校准[1];
uint8_t*apb=&pamiec[w];
*(重新解释铸造(apb))=513;
printf(“%u”,apb==(uint8_t*)xx);
printf(“%u%u%u”,*apb,*(apb+1),*(重新解释(apb));
}
运行此命令后,我有以下输出:

1//校准[1]。ile_pamiec等于20
1 1 2 513//地址与预期地址相同,并且正确存储了值
12 16777218//地址与预期相同,但值存储不正确

唯一的区别是缓冲区索引不是直接传递的,而是通过变量传递的。
Calibration是存储有关事务(缓冲区偏移量、如何处理事务等)元数据的结构。

我打赌它会随机崩溃,因为您正在恢复到(缺乏)类型安全性的程序集级别。