美文网首页
printf 从现象到本质

printf 从现象到本质

作者: wenfh2020 | 来源:发表于2020-03-01 10:18 被阅读0次

讲真,要深入理解 printf,只能自己看源码。666...


从现象到本质

前些时间,朋友问了一个问题:

printf%s 格式输出,如果参数是其它类型的数据强制转换为 char* 的,结果会怎么样?

我想最好的方法莫过于马上动手测试一下,看看结果。如果再问:printf 是线程安全的吗?... 问题很多,这些都只是问题的表象,要从现象看本质。Linux 是开源的,何不看源码理解程序工作原理呢?


从源码上看 strnlen 是通过查找内存的 ‘\0’ 字符串结束符的。如果强制转换的内存数据,没有 ‘\0’ 结束符,那 strnlen 就会出现问题。

/* https://github.com/torvalds/linux/blob/master/arch/x86/boot/printf.c */

int printf(const char *fmt, ...) {
    char printf_buf[1024];
    va_list args;
    int printed;

    va_start(args, fmt);
    printed = vsprintf(printf_buf, fmt, args);
    va_end(args);

    puts(printf_buf);

    return printed;
}

int vsprintf(char *buf, const char *fmt, va_list args) {
    ...
    switch (*fmt) {
        ...
        case 's':
            s = va_arg(args, char *);
            len = strnlen(s, precision);

            if (!(flags & LEFT))
                while (len < field_width--)
                    *str++ = ' ';
            for (i = 0; i < len; ++i)
                *str++ = *s++;
            while (len < field_width--)
                *str++ = ' ';
            continue;
    }
    ...
}

/* https://github.com/torvalds/linux/blob/master/arch/x86/boot/string.c */

size_t strnlen(const char *s, size_t maxlen) {
    const char *es = s;
    while (*es && maxlen) {
        es++;
        maxlen--;
    }

    return (es - s);
}

总结

不只 printf 的实现,很多基础函数,都能从 linux 源码中查看。可以从 github 下载一份源码,方便查看。下载个 zip 文件包吧,git 文件有点太大了。

/* https://github.com/torvalds/linux/blob/master/lib/string.c */

char *strcpy(char *dest, const char *src) {
    char *tmp = dest;

    while ((*dest++ = *src++) != '\0')
        /* nothing */;
    return tmp;
}

相关文章

  • printf 从现象到本质

    讲真,要深入理解 printf,只能自己看源码。666... 从现象到本质 前些时间,朋友问了一个问题: prin...

  • 从现象到本质

    昨天小妹妹跟我说,他们群里有人因为刷单被骗钱了。她特别感慨。因为之前她也被骗过,直接刷了几百块钱的礼品券后,对方就...

  • 从现象到本质

    这是一个由生活中的小事,引申剖析出人生的哲学。 不多说废话,之前我用家里面浴霸的时候,把水开满,然后那个烧水的燃气...

  • 从现象到本质

    早起不是问题, 早起做什么才是问题! 早起做什么也不是问题, 早起要做到什么才是问题! 做到什么也不是问题, 为什...

  • 从现象到本质——关于川航

    很庆幸由于机长的专业和责任心保住了乘客们的性命,真为他们鼓掌。这将是史无前例的一次应急管理案例,我相信这次事...

  • 电脑内存清理原理

    如下参考:Windows内存清理工具实现——从现象到本质

  • 知识体系构建

    循环 从现象观察到找到本质,最后到个人成长

  • 从现象看本质

    这几天不断发酵的滴滴事件,确实触目惊心,也让大家感触颇深。浙江温州20岁女孩遇害事件,再一次将滴滴推向了舆论焦点。...

  • 从现象看本质

    在初一级部有个很出名的班级,这个班级的成绩不错,纪律也得到好评,今天上午的考试,我就去了这个班上监考。 然而,我发...

  • 从现象看本质

    人类在认知事物的过程中,是从现象开始的。通过对各类表面现象的认识,思考、分析,实践,再认识,逐步使认识走向深入而看...

网友评论

      本文标题:printf 从现象到本质

      本文链接:https://www.haomeiwen.com/subject/nzztkhtx.html