C 操作系统如何知道不同指针的增量?
对于32位操作系统,我们知道指针大小是4个字节,因此C 操作系统如何知道不同指针的增量?,c,pointers,C,Pointers,对于32位操作系统,我们知道指针大小是4个字节,因此sizeof(char*)是4,sizeof(int*)是4,等等。我们还知道,当您增加char*时,字节地址(偏移量)会改变sizeof(char);当您增加一个int*时,字节地址将改变sizeof(int) 我的问题是: 操作系统如何知道(YourType)大小的字节地址要增加多少 操作系统实际上与此无关——这是编译器的工作(正如@zneak所提到的) 编译器知道这一点,因为它只是编译了该结构或类——在结构的情况下,大小几乎是所有结构内
sizeof(char*)
是4,sizeof(int*)
是4,等等。我们还知道,当您增加char*
时,字节地址(偏移量)会改变sizeof(char)
;当您增加一个int*
时,字节地址将改变sizeof(int)
我的问题是:
- 操作系统如何知道(YourType)大小的字节地址要增加多少李>
- 操作系统实际上与此无关——这是编译器的工作(正如@zneak所提到的)
编译器知道这一点,因为它只是编译了该结构或类——在结构的情况下,大小几乎是所有结构内容大小的总和。这主要是C(或C++)编译器的问题,而不是操作系统本身的问题 编译器知道基本类型的对齐规则,并将这些规则应用于您创建的任何类型。因此,它可以确定
的对齐要求和大小,并确保将任何YourType
变量按正确的值递增。对齐规则因硬件(CPU)而异,编译器负责知道应用哪些规则 一个关键点是,YourType*
的大小必须确保当您有一个数组时: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*