C++ 为什么C++;始终显示十六进制内存地址而不仅仅是整数?
我想知道为什么在c中打印一个变量的地址会得到类似于823759733的输出 同时,在C++中做同样的操作显示0x7FF64? 这是“cout”的作品吗?它将地址格式化为十六进制?或者变量内存地址是隐藏的,以显示一些任意地址来封装它?? 我知道C++中虚拟内存中的一切都在进行,这对于C? 范例-C++ 为什么C++;始终显示十六进制内存地址而不仅仅是整数?,c++,c,memory,encapsulation,addressing,C++,C,Memory,Encapsulation,Addressing,我想知道为什么在c中打印一个变量的地址会得到类似于823759733的输出 同时,在C++中做同样的操作显示0x7FF64? 这是“cout”的作品吗?它将地址格式化为十六进制?或者变量内存地址是隐藏的,以显示一些任意地址来封装它?? 我知道C++中虚拟内存中的一切都在进行,这对于C? 范例- int a=10; int* ptr=&a; printf("%d", ptr); 它应该打印一个整数 C++编写的相同代码 及 cout我猜你是在用C打印这样的东西: v
int a=10;
int* ptr=&a;
printf("%d", ptr);
它应该打印一个整数
<> C++编写的相同代码
及
cout我猜你是在用C打印这样的东西:
void* p;
...
printf("%d", p);
%d
说明符作为整数打印,输出为base-10
我猜C++中你做了一些类似的事情:
void* p;
...
std::cout << p;
void*p;
...
std::coutC中printf
的格式说明符的角色被操作符的不同重载所占据,这就是问题所在
printf("%d", ptr);
结果可能是完全错误的。在我的系统上,一个int
有4个字节,一个指针有8个字节。当我尝试将指针打印为十进制(%d
)时,它会导致未定义的行为。在我的示例中,我将未定义的行为视为溢出。您应该使用%p
打印指针
printf("%p", ptr);
编译器应该向您显示如下警告:
warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]
一个例子
#include <stdio.h>
int main() {
int a;
int* ptr = &a;
printf("%d", ptr);
}
运行时输出:
-204940372
如何用C打印地址?看起来你的C代码中有什么地方做错了。是否启用了编译器警告?你的编译器应该向你说明你做错了什么。当要求人们分析你的代码时,请说明你的代码引用(地址)在十进制形式下是毫无意义的。在C中很难找到十进制地址的用法,printf(“%d”,ptr)代码>是未定义的行为,因为打印说明符与参数不匹配。使用printf(“%p”,(void*)ptr)代码>谢谢你的回答,完全理解格式说明符,但是当你说,你的系统有4个字节的整数,8个字节的指针,这可能会导致一些溢出问题。但是,如果我将指针类型设置为int指针,指针现在应该包含4个字节而不是8个字节,对吗?它应该不会引起任何问题吗?对不起,我要说的有点深入,我总是很好奇learning@NishadSandilya不,所有指针的大小都相同。指针在32位系统上有4个字节,在64位系统上有8个字节。整型指针的大小与双指针或空指针的大小相同。“所有指针的大小都相同”-->不完全相同。然而这里的重点是int
的大小和int*
的大小可能不同。“指针在32位系统上有4个字节,在64位系统上有8个字节”-->也不完全一样。尽管如您所说,N位是常见的,但系统的N位通常指的是本机整数大小,而不是指针大小。指针大小和本机整数大小可能不同。本机整数可能不同于int
@chux,因为我知道N位描述内存地址。32位系统具有32位地址,因此最多可使用4 GB内存。64位系统使用64位地址,可以使用更多内存。请注意,即使参数的大小匹配,使用错误的格式说明符在技术上也是错误的。“默认情况下,指针以16进制输出。”-->我怀疑十六进制输出是常见的,而不是默认的。
prog.c: In function 'main':
prog.c:5:14: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]
5 | printf("%d", ptr);
| ~^ ~~~
| | |
| int int *
| %ls
-204940372