关于printf 输出字符串的内部运行猜测

来源:互联网 发布:新闻稿发布左盾网络 编辑:程序博客网 时间:2024/06/11 10:03

关于printf 输出字符串的内部运行猜测

最普通的一个例子。

char str[10]="hello!";printf("%s", str);

其中,%s是输出字符串的标志,str是一个地址。这是大家都知道的。再以下是我自己猜测的内容,如果有误希望您能联系我,帮我指出,谢谢。

在系统内存中为str分配了10个字节,str表示其首地址,依次储存的是 h e l l o ! \0 \0 \0 \0 。然后执行printf的时候,读取到%s,让系统知道接下来要用一个读取字符串的方法,输出下面的数据。读取到 str这个首地址时,就以一个字节为单位,依次输出,直到输出的数据值为0为止,即 \0 。故上面的程序段输出结果为 hello! 。

有了这样的猜测,那我们来验证一下。

    ///1094795585 的二进制 0100 0001 0100 0001 0100 0001 0100 0001    int a[3]={1094795585};    printf("%s\n",a);    return 0;

这个程序通过gcc编译运行出来的结果为 AAAA 。
很奇怪是不是,那么就用上面所说的printf的输出字符串的机制来解释下这个问题。
首先,1094795585 这个数字在内存中储存时的二进制代码就是上面写的,由于是int型,每个字节中储存的都是 0100 0001 也就是65,A 的ASCⅡ码值。其次呢,a也是一个地址,是一个空间大小为12个字节的首地址。最后,按照输出字符串的机制进行这个输出,每次读取8位,对应ASCⅡ码值输出对应的字符,直到读取到的为0 。

0 0