C 操作系统如何知道不同指针的增量?

C 操作系统如何知道不同指针的增量?,c,pointers,C,Pointers,对于32位操作系统,我们知道指针大小是4个字节,因此sizeof(char*)是4,sizeof(int*)是4,等等。我们还知道,当您增加char*时,字节地址(偏移量)会改变sizeof(char);当您增加一个int*时,字节地址将改变sizeof(int) 我的问题是: 操作系统如何知道(YourType)大小的字节地址要增加多少 操作系统实际上与此无关——这是编译器的工作(正如@zneak所提到的) 编译器知道这一点,因为它只是编译了该结构或类——在结构的情况下,大小几乎是所有结构内

对于32位操作系统,我们知道指针大小是4个字节,因此
sizeof(char*)
是4,
sizeof(int*)
是4,等等。我们还知道,当您增加
char*
时,字节地址(偏移量)会改变
sizeof(char)
;当您增加一个
int*
时,字节地址将改变
sizeof(int)

我的问题是:

  • 操作系统如何知道(YourType)大小的字节地址要增加多少
      操作系统实际上与此无关——这是编译器的工作(正如@zneak所提到的)


      编译器知道这一点,因为它只是编译了该结构或类——在结构的情况下,大小几乎是所有结构内容大小的总和。

      这主要是C(或C++)编译器的问题,而不是操作系统本身的问题

      编译器知道基本类型的对齐规则,并将这些规则应用于您创建的任何类型。因此,它可以确定
      YourType
      的对齐要求和大小,并确保将任何
      YourType*
      变量按正确的值递增。对齐规则因硬件(CPU)而异,编译器负责知道应用哪些规则

      一个关键点是,
      YourType
      的大小必须确保当您有一个数组时:

      YourType array[20];
      

      然后
      &数组[1]==&数组[0]+1
      &array[1]
      的字节地址必须增加
      sizeof(YourType)
      ,并且(假设
      YourType
      是一个结构),
      数组[1]
      的每个元素必须正确对齐,就像
      数组[0]的元素一样
      必须正确对齐。

      编译器只有知道
      YourType*
      类型的指针的大小,才知道如何递增该类型的指针,这是当且仅当编译器此时知道
      YourType
      的完整定义时才会发生的情况

      例如,如果我们有:

      struct YourType *a;
      struct YourOtherType *b;
      
      struct YourType {
          int x;
          char y;
      };
      
      然后您可以这样做:

      a++;
      
      b++;
      
      但不允许您这样做:

      a++;
      
      b++;
      
      …因为
      struct YourType
      是一个完整类型,而
      struct YourOtherType
      是一个不完整类型

      gcc
      给出的行
      b++的错误是:

      error: arithmetic on pointer to an incomplete type
      

      还要记住,类型是在编译代码中定义的,以匹配您正在使用的硬件。这完全取决于用于解决此问题的源代码

      因此,低端芯片组16位目标C程序可能需要定义与32位系统不同的类型

      编程语言和编译器是控制类型的工具。不是操作系统或硬件


      当然,尝试将32位数字粘贴到16位寄存器可能会有问题

      C指针是类型化的,不像PL/1这样的旧语言。这不仅可以知道对象的大小,还可以执行加宽操作和格式化。例如,获取*p处的数据,是浮点、双精度还是字符?编译器需要知道(例如,考虑划分)


      当然,我们有一个无类型指针,
      void*
      ,你不能用它做任何算术运算,因为编译器不知道要向地址添加多少。

      操作系统不知道。这是一个编译器问题。