我的应用程序在将字节值分配给未引用的4字节指针时出现错误:

uint8_t value = 5;
uint8_t myArray [4] = {1,2,3,4};
uint32_t *myPointer = &myArray[0];

*myPointer = value; // myArray is now {5,0,0,0}
//*(uint8_t*)myPointer = value; // works correctly, myArray: {5,2,3,4}

在我看来,这是一个相当讨厌的,很难发现的错误,并且在编译期间没有出现任何警告,即使所有的警告都打开了。既然value的大小显而易见,编译器为什么不处理这个问题?另外,我认为指针大小的概念与指向更高地址的能力相关,而不是实际分配了多少内存。

最佳答案

为什么编译器不处理这个
因为你得到了你写的东西!
如果为32位存储分配一个值,您将访问32位存储。如果你说:

uint32_t *myPointer

如果需要8位值,请使用指向8位值的指针!
编译器会处理这一切!但不能将8位值写入指向32位值的指针。这将导致从8位值转换为32位值!
 uint8_t val;
 uint32_t *myPointer;
 *myPointer = val;

结果:
 *myPointer = ( uint32_t ) val;

10-04 13:28