指针大小不正确[重复]
Posted
技术标签:
【中文标题】指针大小不正确[重复]【英文标题】:Pointer size not correct [duplicate] 【发布时间】:2012-11-12 12:20:24 【问题描述】:可能重复:What the pointer size in 64 bits computer in C++?
我正在大学学习 C。
我尝试在 Windows 7/8 上设置编程环境并遇到问题
这段代码:
int main()
int *p;
printf("%d",sizeof(p));
return 0;
打印 4 而不是 8(大学打印 8)。 我能做什么?
我的 Windows 是 64 位和 x64 处理器。
【问题讨论】:
您的编译器可能会为 x86 CPU 编译代码。什么是编译器以及包含哪些选项?视觉工作室?如果是这样,你应该让它编译 x64 位应用程序,据我所知,默认情况下,它编译 32 位应用程序。 这不是问题的原因,但sizeof
返回size_t
。当您调用printf("%d", ...
时,您会将其打印为int
。您应该使用printf("%zu", ...
或简单地将sizeof
的结果转换为int
。
@PascalCuoq 不应该是一个答案,而不是一个评论。
@PascalCuoq Pascal,你的意思是 %lu 吗?因为 %lu 是示例中的内容,所以我错误地设置了 %d。当我使用 %lu 编译时,它说“期望参数为 long unsigned int,但参数 2 的类型为 int *”顺便说一句,编译后带有 lu 警告,它会打印 8。
%zu
是用于打印size_t
类型值的格式。更多描述可以在***.com/a/5943869/139746 找到。我不会将此作为答案,因为它不会解决问题真正涉及的不相关的 4/8 问题。如果编译器不支持%zu
,则解决方法是printf("%d",(int)sizeof(...
或printf("%lu",(unsigned long)sizeof(...
【参考方案1】:
您可能会将代码编译成 32 位应用程序。您需要将其编译为 64 位应用程序。检查您的编译器设置。你的操作系统是 64 位并不重要。
【讨论】:
好的,我可以使用哪些编译器来编译为 64 位应用程序?我的编译器是 minGW gcc。 @AndreyDobrikov:我会使用 VS 2012,但它更像是一个 C++ 编译器。对于 C,您可以尝试 mingw-w64。 @AndreyDobrikov 尝试将-m64
作为编译器参数。
@RedX -m64 "抱歉,未实现:64位模式未编译。
@JurajBlaho 有没有 mingw-w64 exe?或者我如何使用它?当我尝试下载时,我得到没有 bin 和 gcc.exe 的 *.tar 文件...【参考方案2】:
这里的“问题”是取决于编译架构的结果。
C 中的基本类型(例如 int
、double
、char
)没有预定义的大小;由编译器决定为哪种类型使用哪种大小。
至于指针,您通常希望能够寻址您机器上可用的任何内存位置。 在 32 位架构上,地址范围是 2^32。由于指针只不过是一个数字,指的是内存所在的地址,所以 2^32 个地址(即 4 字节的范围)就可以了。
对于 64 位系统,为了寻址所有内存,需要 2^64 的范围(即 8 个字节)。
因此,指针大小需要取决于系统架构。
请记住:所有指针类型(无论是int*, char*, double*
还是其他)都具有相同的大小!因此,在 32 位上使用整数和整数指针可能会有点混乱,因为 int
在大多数架构上也有 4 个字节的大小。
【讨论】:
以上是关于指针大小不正确[重复]的主要内容,如果未能解决你的问题,请参考以下文章