繁体   English   中英

C type casting 怀疑当类型在这里和那里转换多次

[英]C type casting doubts when type are converted many times here and there

这种类型转换在做什么?

ph = (struct Proghdr *)((uint8_t *) ELFHDR + ELFHDR->e_phoff);

在这里, ELFHDR已经定义为#define ELFHDR ((struct Elf *) 0x10000)

我想问: 最后, ph中的值将是(struct Proghdr *)那么(uint8_t *)需要什么?

如果有人解决我与类型转换相关的问题,我将不胜感激。

C 中的指针运算是以所指向类型的大小为单位执行的。 因此,例如,如果p是指向double的指针,则p = p + 1会将double的大小(以字节为单位)添加到p中存储的地址。

在您的情况下,指向结构的e_phoff成员包含某些特定数据的字节偏移量; 但是,只需将该值添加到ELFHDR指针本身(属于Elf*类型),就会将该值乘以Elf结构的大小。 因此,为了正确使用该字节偏移量,首先将指针转换为uint8_t* ,以便根据原始(单个)字节执行任何指针算法。

记住等价p[i] == *( p + i )

给定指针p和 integer ip + i将指针p前进i*p的大小。

例如,您会看到p提前了uint32_t时间大小的 8 倍,如下所示:

uint32_t a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
uint32_t *p = a;
p = p + 8;
printf( "%" PRIu32 "\n", *p );  // 8

因此,如果您想将指针前进i个字节,则需要一个指向字节 ( char ) 的指针。

uint32_t a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
uint32_t *p = a;
p = (uint32_t *)( (char *)p + 8 );
printf( "%" PRIu32 "\n", *p );  // 2

uint8_t在您发布的代码段中用作char的等价物。

编译资源管理器上的演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM