printf打印输出null问题的跟踪

最近在工作中,遇到一处 printf输出有null的情况,在此记录一下,问题分析的过程。

测试代码很简单,本机为64位操作系统:

#include <stdio.h>
#include <time.h>

int main(){
    char addr[128] = "127.0.0.1";
    printf("1. output: %s \n", addr);
    printf("2. %ld output: %s \n", 100, addr);
    printf("3. %ld output: %s \n", time(NULL), addr);

    return 0;
}

输出结果为:
printf输出

前两个很好理解,第三项输出有 (null),这里就很奇怪了,后面的addr变量没有正确输出。

继续一些测试,


__time32_t test_time_t_32_return()
{
    return 100;
}

__time64_t test_time_t_64_return()
{
    return 100;
}

printf("__time32_t:%d __time64_t:%d\n", sizeof(__time32_t), sizeof(__time64_t));
printf("6. %ld output: %s \n", test_time_t_32_return(), addr);
printf("7. %ld output: %s \n", test_time_t_64_return(), addr);

ceshi

上说结果表明:当time(NULL)返回32位数时,printf输出是正确的,返回64位数字时,输出为空。
经过查找资料,得知printf输出格式化%ld只能输出32位数字,当输入内容为64位数字时,应当会截取低32位,当做%ld的输入,而高32位内容为空,会传递给后一个参数%s,当%s接收到输入0,会输出(null).

下面经过一些实际代码来验证下:

    __time64_t test = 0x12345678abcdabcd;
    printf("7. low 32: %lx high 32: %lx\n", test);
    printf("8. 64 interger: %llx \n", test);
    printf("9: %s", 0);

输出内容如下:

5c18b5ef32ce9.jpg

printf输出的格式控制字符,%lx以16进制打印输出32位数字,%llx以16进制打印输出64位数字。
printf的格式控制字符,%s在内部解析时,应该有判断为空的情况,传入为空字符串,会转为输出(null)字符串。以上是猜测,让我们深入源码来了解下:

windows上,VC编译器会附带C标准库的实现,通过查找,初步定位在D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\printf.c文件中,将此文件拉入VS2010,在printf函数的入口处打上断点,开启调试就可以进入源码调试。

我们本次的兴趣点在输出(null)的情况,因此,直接跟进去查找(null)字符串出现和使用的地方即可:

空字符串定义如下图:
5c18b6043112b.jpg

空字符串转换如下图:
5c18b6161018b.jpg

小结:打印输出时,注意32位整数和64位整数的打印方式区分。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值