x64处理器上的C语法有何不同
我正在读一本关于C和GNU的书,但它引用了32位处理器上的代码。我已经发现EIP实际上是64位的RIP,但当我处理指针时,它一直给我提供了很多信息。。。是否还有一些我不知道的差异???谢谢-指针代码-x64处理器上的C语法有何不同,c,pointers,memory,gnu,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); 你的代码应该是 pointr = &j; 带pointr=j您正在为指针分配j的值,即10。当不使用内联汇编时,一个主要的
int j = 10;
int *pointr;
pointr = j;
printf("in j has an adress of %p", pointr);
你的代码应该是
pointr = &j;
带
pointr=j
您正在为指针分配j
的值,即10
。当不使用内联汇编时,一个主要的变化是指针大小。如果您的程序不明确地依赖于指针的大小,您通常应该可以
有关64位C/C++代码问题的详细列表,请参阅
在代码中,应使用:
pointr = &j;
事实并非如此。除了一些变量(esp指针)的大小可能不同之外
这几乎不重要,但如果真的重要, 您应该使用
sizeof
来获取重要的尺寸
但是,您的代码可能应该使用j
无论是64位还是32位
int j = 10; int *pointr;
pointr = &j;
printf("in j has an adress of %p", pointr);
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);
C是源语言,而不是指令集体系结构。它的语法独立于任何处理器。这个问题,也许应该重写为“我在指针上做错了什么?”或“在x64处理器上C语法有什么不同?”删除对其他处理器的所有引用,并根据所决定的内容。伙计,当有人问一个基本的编程问题时,所有答案同时出现的数量——还没有人提到这个问题;如果启用警告,则会通知您此类型的类型不匹配问题。对于gcc,请尝试使用
-Wall-Wextra
进行最大限度的诊断