c - 使用基地址访问结构体成员

标签 c pointers

您能帮忙解释一下为什么下面的程序可以正确打印所有结构成员的值吗?

struct st
{
  int i;
  char c1;
  int j;
  char c2;
};

int main()
{
  struct st a = {5, 'i', 11, 'H'};
  struct st * pa = &a;

  int first;
  char second;
  int third;
  char fourth;

  first = *((int*)pa);
  second = *((char*)pa + 4); /* offset = 4 bytes = sizeof(int) */
  third = *((int*)pa + 2); /* why (pa + 2) here? */
  fourth = *((char*)pa + 12); /* why (pa + 12) here? */
  printf ("first = %d, second = %c, third = %d, fourth = %c\n", first, second, third, fourth);
  return 0;
}

输出:第一个 = 5,第二个 = i,第三个 = 11,第四个 = H

如何使上述程序通用化?

最佳答案

这是因为结构中添加了填充字节。 char Second;后会添加三个填充字节,这是因为char后面跟着一个int(对齐较大的成员),所以填充将插入字节以使对齐方式为较大成员的对齐方式的倍数。

关于c - 使用基地址访问结构体成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52623650/

相关文章:

c - 我用于获取单词的奇怪的非工作 C 代码

c - C 中的指针和局部数组

c - 使用 C 中的函数将字符串数组设置为另一个

c - 类型转换为 char 后打印单个字节

c - 使用条件变量进行线程间通信?

c - 从所有数组元素打印字符串

c++ - 在 C++ 中创建模板以处理指向对象和原始类型的指针

c++ - 对包含指针的结构进行 Qsort

c - 在 Telnet session 中处理转义序列

c - 如何在C中声明一个大小与运行时输入的字符串大小相同的char数组?