我正在读一本关于C和GNU的书,但它引用了32位处理器上的代码。我已经发现 EIP 实际上是 64 位的 RIP,但是当我处理指针时,它一直给我带来麻烦......是否还有其他我不知道的差异???谢谢 - 指针代码 -
int j = 10;
int *pointr;
pointr = j;
printf("in j has an adress of %p", pointr);
你的代码应该是
pointr = &j;
使用pointr = j;
您将j
的值分配给指针,即10
指针。
C 的语法在所有处理器上都是相同的。
不同的是不同原生类型的大小。 允许的内容有规则,但创造力也有很大的空间。 特别是,指针在 64 位计算机上的长度为 8 个字节,而不是在 32 位计算机上的长度为 4 个字节。大多数 32 位编译器将int
和long
视为 32 位类型;大多数 64 位编译器将long
视为 64 位类型,值得注意的例外是 Windows 64,其中long
仍然是 32 位类型。
请注意,您的代码应为:
int j = 10;
int *pointr = &j;
printf("int j has an address of %pn", pointr);
不是。
除了某些大小的变量(尤其是指针)可能不同。
这几乎无关紧要,但如果确实如此,如果它们很重要,您应该使用sizeof
来获取尺寸。
但是,您的代码可能应该采用j
的地址无论是 64 位还是 32 位
int j = 10; int *pointr;
pointr = &j;
printf("in j has an adress of %p", pointr);
不使用内联程序集时更改的一个主要内容是指针大小。如果您的程序不明确取决于指针大小,则通常应该没问题。
有关 64 位 C/C++ 代码问题的详细列表,请参阅 http://www.viva64.com/en/a/0065/。
在代码中,应使用:
pointr = &j;