当类型在这里和那里多次转换时,C 类型产生疑问
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 中的指针运算是以 pointed-to 类型大小的单位执行的。因此,例如,如果 p
是指向 double
的指针,则 p = p + 1
会将 double
的大小(以字节为单位)添加到 [=] 中存储的地址10=].
在您的情况下,pointed-to 结构的 e_phoff
成员包含某些特定数据的 byte 偏移量;但是,只需将该值添加到 ELFHDR
指针本身(属于 Elf*
类型)就会将该值乘以 Elf
结构的大小。因此,为了正确使用该字节偏移量,首先将指针转换为 uint8_t*
,以便根据原始(单个)字节执行任何指针运算。
记住等效项 p[i] == *( p + i )
。
给定指针 p
和整数 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
。
Demo 在编译资源管理器上
这个类型转换是做什么的?
ph = (struct Proghdr *)((uint8_t *) ELFHDR + ELFHDR->e_phoff);
这里,ELFHDR
已经定义为#define ELFHDR ((struct Elf *) 0x10000)
。
请问:最后ph
里面的值是(struct Proghdr *)
那么(uint8_t *)
需要什么?
如果有人能解决我关于类型转换的问题,我将不胜感激。
C 中的指针运算是以 pointed-to 类型大小的单位执行的。因此,例如,如果 p
是指向 double
的指针,则 p = p + 1
会将 double
的大小(以字节为单位)添加到 [=] 中存储的地址10=].
在您的情况下,pointed-to 结构的 e_phoff
成员包含某些特定数据的 byte 偏移量;但是,只需将该值添加到 ELFHDR
指针本身(属于 Elf*
类型)就会将该值乘以 Elf
结构的大小。因此,为了正确使用该字节偏移量,首先将指针转换为 uint8_t*
,以便根据原始(单个)字节执行任何指针运算。
记住等效项 p[i] == *( p + i )
。
给定指针 p
和整数 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
。
Demo 在编译资源管理器上