C/C++占位符,%x和%p的区别

news2024/9/22 13:40:39

遇到的问题

今天遇到了一个很奇怪的问题,当使用malloc分配了一个堆空间后,分别尝试用coutprintf尝试打印该地址,出现了两个地址不一样的情况:

int *pp = (int*)malloc(10*sizeof(int));
*pp = 1234;
cout << pp << '\t' << *pp << endl;
printf("0x%x\t%d\n", pp, *pp);
free(pp);

可以看出两个地址低32位是一致的,出现问题的原因应该是printf显示不全导致的。

image-20230423162758215

后来弄明白了,这是C/C++里占位符之间的区别导致的。

C/C++占位符%x和%p

%x%X:表示的是输入数字的十六进制表达,长度为32bit

%p:表示的是输入变量的指针(地址)值,十六进制数,长度由当前操作系统决定

实际上,上面cout流输出的pp表示的就是实际的地址值,和%p是一个意思,当我们使用%p输出时,结果就是正常的:

printf("%p\t%d\n", pp, *pp);

image-20230423172245192

那么%x输出的时候为什么不对呢?这是因为%x是按照int占位4字节来表示的,在16位和32位系统里,由于地址不超过4字节,所以不会导致%x和%p的输出区别。

但是在64位系统里,%p占位变成了8字节,而%x则还是4字节,所以高位就被截断了。

如果需要正确输出,我们可以指定%llx,这样输出结果就是一致的了:

image-20230423173910954

C/C++占位符总结

格式化占位符(format placeholder),语法是:

%[*parameter*][*flags*][*field width*][.*precision*][*length*]*type*

Printf.svg

Parameter可以忽略或者是:

字符描述
*n*$n是用这个格式说明符(specifier)显示第几个参数;这使得参数可以输出多次,使用多个格式说明符,以不同的顺序输出。 如果任意一个占位符使用了parameter,则其他所有占位符必须也使用parameter 这是POSIX扩展,不属于ISO C。例:printf("%2$d %2$#x; %1$d %1$#x",16,17) 产生"17 0x11; 16 0x10"

Flags可为0个或多个:

字符描述
+总是表示有符号数值的’+‘或’-'号,缺省情况是忽略正数的符号。仅适用于数值类型。
空格使得有符号数的输出如果没有正负号或者输出0个字符,则前缀1个空格。如果空格与’+'同时出现,则空格说明符被忽略。
-左对齐。缺省情况是右对齐。
#对于’g’与’G’,不删除尾部0以表示精度。对于’f’, ‘F’, ‘e’, ‘E’, ‘g’, ‘G’, 总是输出小数点。对于’o’, ‘x’, ‘X’, 在非0数值前分别输出前缀0, 0x, and 0X表示数制。
0如果width选项前缀以0,则在左侧用0填充直至达到宽度要求。例如printf("%2d", 3)输出" 3",而printf("%02d", 3)输出"03"。如果0-均出现,则0被忽略,即左对齐依然用空格填充。

Field Width给出显示数值的最小宽度,典型用于制表输出时填充固定宽度的表目。实际输出字符的个数不足域宽,则根据左对齐或右对齐进行填充。实际输出字符的个数超过域宽并不引起数值截断,而是显示全部。宽度值的前导0被解释为0填充标志,如上述;前导的负值被解释为其绝对值,负号解释为左对齐标志。如果域宽值为*,则由对应的函数参数的值为当前域宽。

Precision通常指明输出的最大长度,依赖于特定的格式化类型。对于d、i、u、x、o的整型数值,是指最小数字位数,不足的位要在左侧补0,如果超过也不截断,缺省值为1。对于a,A,e,E,f,F的浮点数值,是指小数点右边显示的数字位数,必要时四舍五入或补0;缺省值为6。对于g,G的浮点数值,是指有效数字的最大位数;缺省值为6。对于s的字符串类型,是指输出的字节的上限,超出限制的其它字符将被截断。如果域宽为*,则由对应的函数参数的值为当前域宽。如果仅给出了小数点,则域宽为0。

Length指出浮点型参数或整型参数的长度。此项Microsoft称为“Size”。可以忽略,或者是下述:

字符描述
hh对于整数类型,printf期待一个从char提升的int尺寸的整型参数。
h对于整数类型,printf期待一个从short提升的int尺寸的整型参数。
l对于整数类型,printf期待一个long尺寸的整型参数。
对于浮点类型,printf期待一个double尺寸的整型参数。
对于字符串s类型,printf期待一个wchar_t指针参数。
对于字符c类型,printf期待一个wint_t型的参数。
ll对于整数类型,printf期待一个long long尺寸的整型参数。Microsoft也可以使用I64
L对于浮点类型,printf期待一个long double尺寸的整型参数。
z对于整数类型,printf期待一个size_t尺寸的整型参数。
j对于整数类型,printf期待一个intmax_t尺寸的整型参数。
t对于整数类型,printf期待一个ptrdiff_t尺寸的整型参数。

类型 Type,也称转换说明(conversion specification/specifier),可以是:

字符描述
d, i有符号十进制数值int。‘%d’与’%i’对于输出是同义;但对于scanf()输入二者不同,其中%i在输入值有前缀0x或0时,分别表示16进制或8进制的值。如果指定了精度,则输出的数字不足时在左侧补0。默认精度为1。精度为0且值为0,则输出为空。
u十进制unsigned int。如果指定了精度,则输出的数字不足时在左侧补0。默认精度为1。精度为0且值为0,则输出为空。
f, Fdouble型输出10进制定点表示。'f’与’F’差异是表示无穷与NaN时,‘f’输出’inf’, ‘infinity’与’nan’;‘F’输出’INF’, ‘INFINITY’与’NAN’。小数点后的数字位数等于精度,最后一位数字四舍五入。精度默认为6。如果精度为0且没有#标记,则不出现小数点。小数点左侧至少一位数字。
e, Edouble值,输出形式为10进制的([-]d.ddd e[+/-]ddd). E版本使用的指数符号为E(而不是e)。指数部分至少包含2位数字,如果值为0,则指数部分为00。Windows系统,指数部分至少为3位数字,例如1.5e002,也可用Microsoft版的运行时函数_set_output_format 修改。小数点前存在1位数字。小数点后的数字位数等于精度。精度默认为6。如果精度为0且没有#标记,则不出现小数点。
g, Gdouble型数值,精度定义为全部有效数字位数。当指数部分在闭区间 [-4,5] 内,输出为定点形式;否则输出为指数浮点形式。'g’使用小写字母,'G’使用大写字母。小数点右侧的尾数0不被显示;显示小数点仅当输出的小数部分不为0。
x, X16进制unsigned int。'x’使用小写字母;'X’使用大写字母。如果指定了精度,则输出的数字不足时在左侧补0。默认精度为1。精度为0且值为0,则输出为空。
o8进制unsigned int。如果指定了精度,则输出的数字不足时在左侧补0。默认精度为1。精度为0且值为0,则输出为空。
s如果没有用l标志,输出null结尾字符串直到精度规定的上限;如果没有指定精度,则输出所有字节。如果用了l标志,则对应函数参数指向wchar_t型的数组,输出时把每个宽字符转化为多字节字符,相当于调用wcrtomb函数。
c如果没有用l标志,把int参数转为unsigned char型输出;如果用了l标志,把wint_t参数转为包含两个元素的wchart_t数组,其中第一个元素包含要输出的字符,第二个元素为null宽字符。
pvoid *
a, Adouble型的16进制表示,“[−]0xh.hhhh p±d”。其中指数部分为10进制表示的形式。例如:1025.010输出为0x1.004000p+10。'a’使用小写字母,'A’使用大写字母。[2][3] (C++11流使用hexfloat输出16进制浮点数)
n不输出字符,但是把已经成功输出的字符个数写入对应的整型指针参数所指的变量。
%'%'字面值,不接受任何flags, width, precision or length。

参考文献

1:C语言中的%p和%x的区别_百度知道

2:格式化字符串 - 维基百科,自由的百科全书

如有疑问或错误,欢迎和我私信交流指正。
版权所有,未经授权,请勿转载!
Copyright © 2023 by Mr.Idleman. All rights reserved.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

35. 搜索插入位置 58. 最后一个单词的长度

目录 35. 搜索插入位置 思路 代码 58. 最后一个单词的长度 思路1 代码1 思路2 代码2 35. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。…

存钱罐出口欧盟CE认证ROHS标准测试

近年来生活水平提高&#xff0c;人们手头上的余钱也多了起来&#xff0c;家长们通常会给小孩子买存钱罐&#xff0c;培养小孩子的理财能力&#xff0c;养成良好的财富观&#xff0c;一般的存钱罐都被设计用来存放硬币&#xff0c;一般分为陶瓷&#xff0c;塑料和金属。上端有缝…

电脑蓝屏怎么办?一招教你修好

很多用户遇到电脑蓝屏问题之后不懂怎么去进行解决&#xff1f;电脑蓝屏之后&#xff0c;我们只需要花一分钟制作一个启动盘&#xff0c;然后用这个启动盘来进行系统的重装就可以了。那么具体要怎么去操作呢&#xff1f;以下带来具体的操作方法教学。 准备工作&#xff1a; 1、U…

备忘录设计模式(Memento Pattern)[论点:概念、组成角色、示例代码、框架中的运用、适用场景]

文章目录 概念组成角色示例代码框架中的运用适用场景 概念 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;主要用于保存对象的内部状态&#xff0c;以便在需要时恢复到先前的状态。这种模式有助于实现撤销、恢复或回滚操作&#xff0c;同…

软件测试之基础概念学习篇(需求 + 测试用例 + 开发模型 + 测试模型 + BUG)

文章目录 1. 什么是软件测试2. 软件测试和软件开发的区别3. 软件测试和软件调试的区别4. 什么是需求1&#xff09;以需求为依据设计测试用例 5. 测试用例是什么6. 什么是 BUG&#xff08;软件错误&#xff09;7. 五个开发模型1&#xff09;瀑布模型2&#xff09;螺旋模型3&…

有哪些方法可以防止企业内部数据泄露?

企业内部数据安全威胁多数源于企业内部&#xff0c;企业内部存在许多安全威胁&#xff0c;主要包括: 1. 员工误操作或疏忽&#xff1a;这是导致内部安全事故的最主要原因之一。员工对安全程序缺乏认识或执行不严谨&#xff0c;可能会无意中泄露敏感数据或引发系统漏洞。 2. 未经…

Windows 服务监控工具

在任何企业中&#xff0c;Windows 服务都是面向业务的应用程序的核心组件。这些 Windows 服务的有效运行对于防止网络和应用程序停机至关重要。这使得 Windows 服务监视成为任何网络管理策略的关键部分。 Windows 服务监视使管理员能够确保关键 Windows 服务的可用性&#xff…

mysql的函数 --- MySQL总结(二)

mysql的函数 文章目录 mysql的函数日期函数字符串函数其他函数 日期函数 上面的所以的函数都可以使用select进行展现相应的数据 这里的使用current_date()时间戳&#xff0c;其他日期都可以相似的操作进行对于时间的操作 字符串函数 后面这里的操作查找name表之中的id的字符集&…

重构这件“小”事儿 | 得物技术

本文以一个Web项目的业务代码重构实践作为依据&#xff0c;来探讨项目业务代码重构过程中遇到的开发问题&#xff0c;以及重构过程中的一些注意点&#xff0c;希望可以给项目开发和服务开发维护重构提供一些通用的参考与思路。 这里不探讨大型项目的重构实践&#xff0c;毕竟一…

SHELL的脚本编写(2)

目录 1.编写脚本for1.sh&#xff0c;使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如&#xff1a;test1、test2、test3、......、test10 首先创建并编写for1.sh 查看结果 2.编写脚本for2.sh&#xff0c;使用…

Java - Lambda 表达式

一、背景 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式&#xff08;Lambda expression&am…

【数据库】— 2NF、3NF、BCNF、最小函数依赖集例题

判断范式级别 设有关系模式W(C,P,S,G,T,R)&#xff0c;其中各属性的含义是&#xff1a;C课程&#xff0c;P教师&#xff0c;S学生&#xff0c;G成绩&#xff0c;T时间&#xff0c;R教室&#xff0c;根据定义有如下数据依赖集 D{ C→P&#xff0c;(S,C)→G&#xff0c;(T,R)→C&…

时序预测 | MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比)

时序预测 | MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比) 目录 时序预测 | MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 麻雀搜索算法(…

Redis最新版本安装教程——Linux操作系统(Centos7)

Redis是基于C语言编写的&#xff0c;因此首先需要安装Redis所需要的gcc依赖&#xff1a; yum install -y gcc tcl 下载安装包并解压 Redis的官方网站地址&#xff1a;RedisRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cach…

【前端下载文件流详解】前端实现多种类型文件(word,excel,pdf,rar,zip等)的下载,接口返回文件流形式(附源码)

【写在前面】其实之前我也写了有关java实现文件的下载&#xff0c;但是当时是局限于excel文档&#xff0c;针对其他类型的并没有介绍&#xff0c;这次刚好有个客户现场反馈回来的&#xff0c;说我们系统确实能下载报告&#xff0c;但是甲方领导要看所有的报告&#xff0c;这不我…

【持续升级】Vue3 系统入门与项目实战无密分享闻郎江上唱歌声

Vue3 系统入门指南&#xff1a;开发高效、可维护的Web应用 【持续升级】Vue3 系统入门与项目实战 下栽のke呈&#xff1a;https://www.666xit.com/3811/ Vue.js是目前最流行的JavaScript框架之一&#xff0c;它的最新版本Vue3已经发布。Vue3具有更好的性能和可维护性&#x…

HNU数据结构与算法分析-小班6

HNU数据结构与算法分析-小班6

一文带你入门MySQL

目录 一、MySQL登陆1.配置MySQL环境变量2.MySQL登陆命令 二、MySQL基础知识1.数据类型&#xff08;1&#xff09;整型&#xff08;2&#xff09;浮点型&#xff08;3&#xff09;日期型&#xff08;4&#xff09;字符型&#xff08;5&#xff09;数据类型小结 2.MySQL的约束【重…

​力扣解法汇总1105. 填充书架

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给定一个数组 books &#xff0c;其中 books[i] [thicknessi, heighti] 表示第…

【c语言习题】return中途结束 函数调用

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…