[英]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 i
, p + 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.