我正在读一本关于C和GNU的书,但它引用了32位处理器上的代码。我已经发现EIP实际上是64位的RIP,但是当我处理指针时它一直给我树林......是否还有一些我不知道的差异?谢谢 - 指针代码 -
int j = 10;
int *pointr;
pointr = j;
printf("in j has an adress of %p", pointr);
答案 0 :(得分:4)
您的代码应为
pointr = &j;
使用pointr = j;
,您将j
的值10
指定给指针。
答案 1 :(得分:3)
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 %p\n", pointr);
答案 2 :(得分:1)
不是。
除了某些大小的变量(esp指针)可能不同。
这几乎不应该重要,但如果确实如此,
如果它们重要,你应该使用sizeof
来获取尺寸。
但是,您的代码应该采用j
的地址
无论是64位还是32位
int j = 10; int *pointr;
pointr = &j;
printf("in j has an adress of %p", pointr);
答案 3 :(得分:0)
不使用内联汇编时更改的一个主要因素是指针大小。如果你的程序没有明确取决于指针大小,你通常应该没问题。
有关64位C / C ++代码问题的详细列表,请参阅http://www.viva64.com/en/a/0065/。
在您的代码中,您应该使用:
pointr = &j;