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

时间:2011-07-01 00:21:47

标签: c pointers

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

我的问题是:

  • 操作系统如何知道增加sizeof(int)的字节地址的数量?

5 个答案:

答案 0 :(得分:3)

操作系统与此没有任何关系 - 这是编译器的工作(正如@zneak所说)。

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

答案 1 :(得分:3)

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

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

一个关键点是YourType的大小必须是这样的:当你有一个数组时:

YourType array[20];

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

答案 2 :(得分:3)

如果知道YourType *的大小,编译器只知道如何递增类型YourType的指针,当且仅当YourType的完整定义已知时才会出现这种情况此时编译器。

例如,如果我们有:

struct YourType *a;
struct YourOtherType *b;

struct YourType {
    int x;
    char y;
};

然后你可以这样做:

a++;

但您 允许这样做:

b++;

..因为struct YourType完整的类型,但struct YourOtherType不完整的类型。

gcc为行b++;提供的错误是:

error: arithmetic on pointer to an incomplete type

答案 3 :(得分:0)

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

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

编程语言和编译器管理您的类型。不是操作系统或硬件。

虽然当然试图将32位数字插入16位寄存器可能是个问题!

答案 4 :(得分:0)

键入C指针,不像PL / 1这样的旧语言。这不仅允许知道对象的大小,而且可以执行更广泛的操作和格式化。例如,获取* p的数据,是浮点数,双精度数还是字符数?编译器需要知道(例如,想想分歧)。

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