【发布时间】:2021-07-13 18:08:45
【问题描述】:
我刚准备考试,问下面的问题,下面的程序在32位还是64位生成什么输出?
#include <stdio.h>
int main(int argc, char **argv)
{
long *p = (long *)8;
short *q = (short *)0;
int c, i, l;
p = p + 1;
q = q + 1;
printf("p = %p q = %p\n", p, q);
c = (char *)p - (char *)q;
i = (int *)p - (int *)q;
l = (long *)p - (long *)q;
printf("c = %d, i = %d, l = %d\n", c, i, l);
return 0;
}
在 32bit 上的结果如下:
p = 0xc q = 0x2
c = 10, i = 2, l = 2
64位的结果如下:
p = 0x10 q = 0x2
c = 14, i = 3, l = 1
只有我必须承认,我根本无法理解这些结果,因为当我计算一个指针时,它应该指向内存中随机的东西,它总是出现 0xc 或 0x10。
有人可以帮我吗?
【问题讨论】:
-
如果将
1添加到指针,它会将类型的大小添加到指针变量持有的值(地址)。因此,当您将 1 加到short *q时,它的值会增加 2。请注意,c = (char *)p - (char *)q;是 未定义的行为,因为它是不同对象之间的指针运算。 -
你懂十六进制数吗?
-
是的,现在它更有意义了。所以我添加 8 + 4(32 位长)字节 = 12 0xc 和 8+8(64 位长)字节 = 16 0x10。现在有意义
-
但第二个打印。简而言之,当我将我的 12 字节长投射时,它是 12 倍 1 字节的镜头,对吗?减法 1 个短字节是 11,但结果是 10 ...这没有意义,或者我错过了什么?
-
它应该指向内存中随机的东西 - 但是
%p不是打印指针目标的值,而是指针本身。这些语句都没有取消引用指针。在为他们分配了那些硬编码的值之后,无论如何你都会遇到麻烦。
标签: c pointers operating-system long-integer short