gpt4 book ai didi

c++ - 为什么 uint8_t 在分配给取消引用的 uint32_t 指针时用完 4 个字节?

转载 作者:太空宇宙 更新时间:2023-11-04 05:18:22 27 4
gpt4 key购买 nike

我在将字节值分配给取消引用的 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 的大小很明显,为什么编译器不处理这个问题?此外,尽管指针大小的概念与指向更高地址的能力相关,但与实际分配的内存量无关。

最佳答案

编译器会在您犯错时警告您:

uint32_t *myPointer = &myArray[0];

(...)

und.c:8:11: warning: incompatible pointer types initializing 'uint32_t *'
(aka 'unsigned int *') with an expression of type 'uint8_t *'
(aka 'unsigned char *') [-Wincompatible-pointer-types]

您选择将值重新解释为整数,这会导致未定义的行为。在此之后,您尝试第二次重新解释,而忽略了您正在分配给整数的事实。但是现在您陷入了 C 弱类型规则:您可以在没有警告的情况下隐式地从 uint8_t 转换为 uint32_t。如果你想要它,C 会做。

关于c++ - 为什么 uint8_t 在分配给取消引用的 uint32_t 指针时用完 4 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25029280/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com