C中的指针及其大小

rjee0c15  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(104)

一段时间以来,我一直在努力思考这个问题,并寻找相关的问题。我已经找到了一些有意义的答案,但显然我需要这个刻在石头上。
目前我在学习的过程中,一些产品的固件。一组指针已初始化为uint8_t,如下例所示:

uint8_t *pwhatevs;

上面的sizeof将返回1(一个字节)。当稍后在固件中分配此指针时,它将按以下方式指向32位地址:

pwhatevs = (uint8_t *)&whatever;

这种语法对我来说很奇怪。初始部分(uint8_t *)是8位指针类型转换。但是如果我现在使用sizeof pwhatevs,它会返回4(4个字节),我对此并不感到惊讶,但由于指针类型转换,我再次感到非常惊讶。有人能解释一下吗?如果需要更多的信息,我会尽我所能!

**编辑:**在另一个关于指针大小的问题中,提到指针的大小取决于系统,如16,32或64位。这是有道理的,但是为什么*pwhatevs在初始化时大小不是4字节?
**编辑2:**我不能分享整个代码,因为它是一个实际的产品,但会这样做。如果这还不够,我将不得不在一个具体的例子上工作。

jhkqcmku

jhkqcmku1#

你混淆了指针的大小和指针 * 指向 * 的东西的大小。
对于你今天遇到的大多数平台(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)
最重要的是,在C中任何东西的sizeof永远不会改变2。一旦一个变量被声明,它就有一个固定的sizeof。给指针赋值不可能改变指针的大小。你在测量它的大小时做错了什么,但是没有你的完整的代码,你不可能知道是什么。
1有关更深入的信息,请参见示例Can pointers be of different sizes?
2当然,如果你在不同的平台上编译相同的代码,或者在不同的操作系统上编译,或者使用不同的编译器标志,变量的大小可能会不同。但是在单个.c文件的单个编译过程中,它永远不会改变。不是通过分配,也不是通过其他任何东西。

8fq7wneg

8fq7wneg2#

  • uint8_t *pwhatevs;上面的sizeof将返回1(一个字节)。

不会的,你试过吗?sizeof(pwhatevs)将等于地址总线的大小,在所有主流计算机上,地址总线的大小将是2、4或8字节。但是sizeof(*pwatevs)将返回1,因为这是指向类型的大小。这里的问题似乎是你把指向的类型和指针变量本身弄混了。

  • 这种语法对我来说很奇怪。初始部分(uint8_t *)是一个8位指针类型转换。

同样,没有所谓的“8位指针类型转换”。这更像是对指向8位类型的指针的强制转换。指针的大小和指向类型的大小是不同的。

  • 但是如果我现在取pbvs的大小它返回4

不管指针指向哪里,它都沿着这样做。你不能改变C中指针的大小,它们有一个固定的大小,由编译器根据给定的CPU确定。

相关问题