zoukankan      html  css  js  c++  java
  • printf打印输出null问题的跟踪

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

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

    #include <stdio.h>
    #include <time.h>
    
    int main(){
    	char addr[128] = "127.0.0.1";
    	printf("1. output: %s 
    ", addr);
    	printf("2. %ld output: %s 
    ", 100, addr);
    	printf("3. %ld output: %s 
    ", 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
    ", sizeof(__time32_t), sizeof(__time64_t));
    printf("6. %ld output: %s 
    ", test_time_t_32_return(), addr);
    printf("7. %ld output: %s 
    ", 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
    ", test);
        printf("8. 64 interger: %llx 
    ", test);
    	printf("9: %s", 0);
    
    

    输出内容如下:

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

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

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

    空字符串定义如下图:

    空字符串转换如下图:

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

  • 相关阅读:
    Android开发 ViewConfiguration View的配置信息类
    Android 开发 倒计时功能 转载
    Android 开发 关于7.0 FileUriExposedException异常 详解
    Android 开发 实现文本搜索功能
    Android 开发 Activity里获取View的宽度和高度 转载
    Android 开发 存储目录的详解
    Android 开发 Fresco框架点击小图显示全屏大图实现 ZoomableDraweeView
    Android 开发 将window变暗
    Android 开发 DisplayMetrics获取Android设备的屏幕高宽与其他信息
    Android 开发 DP、PX、SP转换详解
  • 原文地址:https://www.cnblogs.com/cherishui/p/10000948.html
Copyright © 2011-2022 走看看