1

如果我有一些整数数组,我们就说:

int iarr[5] = {0, 7, 3, 12, 99};

地址出现在哪个位置0xbfdf53a8;我想用循环打印出这个值,我可以做这样的事情:

for(i=0; i<5; i++)
   printf("value of iarr[%d] = %d\n", i, *(iarr+i));

这个循环是有效的,因为我们每次都增加一个“int”(在典型的 32 位机器上,地址每次迭代增加 4 个字节)。

我的问题是,什么时候应用类型指定的字节偏移量?那是编译过程的一部分(意味着它在某处的程序集中),还是在操作系统级别完成?

我会假设这是如何以标准化方式处理的,但我还没有找到答案。

4

2 回答 2

3

它是编译过程的一部分,编译器生成的代码会考虑操作数的大小。

请注意,您可以使用指向 5412-byte 的指针进行递增和算术运算,struct就像使用指向 4-byte 的指针一样容易int。编译器检查指针表达式的类型并生成正确的代码。

操作系统根本不参与这些底层细节,从它的角度来看,它只是进程中的代码。

于 2012-10-17T14:08:43.667 回答
1

它在编译时完成,并将在程序集(和目标代码)中生成。

操作系统不知道(也不关心)您正在操作的数据类型。它只会为您提供大量(虚拟)原始内存供您使用。

只有您和编译器知道数据类型及其特征。

于 2012-10-17T14:08:38.723 回答