Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C++;始终显示十六进制内存地址而不仅仅是整数?_C++_C_Memory_Encapsulation_Addressing - Fatal编程技术网

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

我想知道为什么在c中打印一个变量的地址会得到类似于823759733的输出 同时,在C++中做同样的操作显示0x7FF64? 这是“cout”的作品吗?它将地址格式化为十六进制?或者变量内存地址是隐藏的,以显示一些任意地址来封装它?? 我知道C++中虚拟内存中的一切都在进行,这对于C? 范例-

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