c程序可以`uint8_t`指向大小为32位的地址

时间:2016-11-02 16:42:54

标签: c pointers memory

在下面的代码中,get_pic()返回指针uint8_t type

然后在main()中调用get_pic(),并将其返回值强制转换为变量address unsigned int

get_pic()返回的指针指向一个全局数组,该数组最终位于地址a8000f80

我的问题是地址a8000f80是32位数。因此,get_pic()返回的指针如何指向此地址,因为它只是8位的uint8_t类型?

//Function declaration
uint8_t* get_pic(int *piclen);

main() {

  unsigned int address, value;
  address = (unsigned int) get_pic((int*)& value);
}

3 个答案:

答案 0 :(得分:2)

uint8_t无法指向任何地方,因为它不是指针。但是uint_8*(指向uint8_t的指针)可以。

你可能想要这个:

uint8_t* get_pic(int *piclen);

main() {
  uint8_t *address;
  int value;

  address = get_pic(&value);
}

get_pic会向uint8_t *返回uint8_t,即指针,因此address的类型应为uint8_t *

传递给getpic的参数是指向intint*)的类型指针,因此value也应该是int*类型。

答案 1 :(得分:1)

它将指针返回到类型为uint8_t的值;这对指针本身的 size 没有任何说明。

答案 2 :(得分:-1)

指针的大小与对象的大小无关,它指向。所以,事实上,对于大多数(也就是几乎所有)实现,sizeof($anything *)是常量(对于任何$anything不是函数)。

所以sizeof(uint8_t _*) == sizeof(uint32_t *) == sizeof(unsigned int *) == sizeof(struct foo *)

uint8_t * get_pic(int * piclen);

这将返回指向某些数据的指针。如果该数据为uint32_t,则将其保存为uint32_t *,C中不需要强制转换(但编译器可能会发出警告):

int len;
uint32_t * address = get_pic(&len);

然后,您可以使用标准语法访问它。

另请注意Michael Walzs的答案,他与我并行写作;)