在x64处理器上C语法有何不同

时间:2014-01-17 03:50:06

标签: c pointers memory gnu

我正在读一本关于C和GNU的书,但它引用了32位处理器上的代码。我已经发现EIP实际上是64位的RIP,但是当我处理指针时它一直给我树林......是否还有一些我不知道的差异?谢谢 - 指针代码 -

int j = 10;
int *pointr;
pointr = j;

printf("in j has an adress of %p", pointr);

4 个答案:

答案 0 :(得分:4)

您的代码应为

pointr = &j;

使用pointr = j;,您将j的值10指定给指针。

答案 1 :(得分:3)

C的语法在所有处理器上都是相同的。

不同的原生类型的大小有所不同。对于允许的内容有规则,但也有很多创造性的空间。特别是,指针在64位机器上长8个字节,而在32位机器上长4个字节。大多数32位编译器将intlong都视为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;