• 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位整数的打印方式区分。

  • 相关阅读:
    AppDelegate减负之常用三方封装
    AppDelegate减负之常用三方封装
    基于AFN封装的带缓存的网络请求
    iOS-创建自己的日志系统
    UIImage 图片处理:截图,缩放,设定大小,存储
    /bin/sh^M: bad interpreter:解决办法
    mac上获取手机的uuid
    iOS PureLayout使用
    iOS集成友盟推送
    完全理解Python的 '==' 和 'is'
  • 原文地址:https://www.cnblogs.com/cherishui/p/10000948.html
Copyright © 2020-2023  润新知