0 c
我已经尝试解决这个问题有一段时间了,并搜索了相关问题。我找到了一些有意义的答案,但显然我需要这个刻在石头上的答案。
目前我正在学习产品的一些固件。一组指针已初始化为uint8_t,如下例所示:
uint8_t *pwhatevs;
Run Code Online (Sandbox Code Playgroud)
上面sizeof将返回1(一个字节)。当稍后在固件中分配该指针时,它将通过以下方式指向 32 位地址:
pwhatevs = (uint8_t *)&whatever;
Run Code Online (Sandbox Code Playgroud)
这种语法对我来说似乎很奇怪。初始部分(uint8_t *)是 8 位指针类型转换。但如果我采取sizeof pwhatevsnow 它会返回4(4 个字节),我对此并不感到惊讶,但由于指针类型转换,我再次感到非常惊讶。有人可以解释一下吗?如果需要更多信息,我会尽可能提供!
编辑:在另一个与指针大小相关的问题中,提到指针的大小取决于系统,例如 16、32 或 64 位。这确实有道理,但是为什么*pwhatevs初始化时的大小不是 4 个字节呢?
编辑2:我无法分享整个代码,因为它是一个实际的产品,但会按照以下方式进行。如果这还不够,我将不得不研究一个具体的例子。


您将指针的大小与指针所指向的对象的大小混淆了。
对于您今天遇到的大多数平台(x86、ARM 等),所有指针将始终具有相同的大小1,无论它们指向什么类型。对于具有 32 位地址空间的平台,指针的长度可能为 4 字节(32 位)。不存在“8 位指针类型转换”这样的东西:类型(uint8_t*)是“指向 8 位变量的指针”,而不是“8 位指针”。
对于你的例子:
(sizeof pwhatevs) == 4<-- 指针类型本身的大小:( sizeof (uint8_t*))。这也可能是 2 或 8,具体取决于平台。
(sizeof *pwhatevs) == 1<-- 指针指向的类型的大小( sizeof (uint8_t))
最重要的是,sizeofC 中的任何内容都永远不会改变2。一旦声明了一个变量,它就有一个固定的sizeof。给指针赋值是不可能改变它的大小的。在测量其大小时,您做错了一些事情,但是如果没有完整的代码,就不可能知道是什么。
1有关更深入的信息,请参阅例如指针可以有不同的大小吗?
2当然,如果您为不同的平台、不同的操作系统或使用不同的编译器标志编译相同的代码,则变量的大小可能会有所不同。但在单个.c文件的单次编译过程中它永远不会改变。不是通过任务,也不是通过其他任何东西。