指针大小不正确[重复]

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 中的基本类型(例如 intdoublechar)没有预定义的大小;由编译器决定为哪种类型使用哪种大小。

至于指针,您通常希望能够寻址您机器上可用的任何内存位置。 在 32 位架构上,地址范围是 2^32。由于指针只不过是一个数字,指的是内存所在的地址,所以 2^32 个地址(即 4 字节的范围)就可以了。

对于 64 位系统,为了寻址所有内存,需要 2^64 的范围(即 8 个字节)。

因此,指针大小需要取决于系统架构。

请记住:所有指针类型(无论是int*, char*, double* 还是其他)都具有相同的大小!因此,在 32 位上使用整数和整数指针可能会有点混乱,因为 int 在大多数架构上也有 4 个字节的大小。

【讨论】:

以上是关于指针大小不正确[重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除智能指针的内存释放不起作用[重复]

查找指针指向的数组的大小[重复]

如何获取由函数“malloc”锁定的内存段指针的大小 [重复]

多行 UILabel 没有正确换行 [重复]

chararray的大小和长度不一样[重复]

如何在不知道c中大小的情况下遍历数组[重复]