看一下下面的一段简单的C语言程序,它的输出结果是多少:
#include<stdio.h>
#include<string.h>
int main()
{
int a=257;
char buf[5] = "aaaa";
strcpy(buf ,(char*)&a);
printf("%d\n",strlen(buf));
return 0;
}
分析:257用二进制表示为:000100000001,用16进制表示为:0x00000101,因为一个字节可以存两个16进制,所以在内存中的是1 1 0 0...。buf在内存中的应该以"aaaa\0"来存储,形式是 65 65 65 65 00。
(char*)&a:即把a转换成char类型的指针,此时a指向整形的四个字节中的第一个字节,如图:
strcpy的功能:即:将a指向的内容依次拷贝到buf指向的内容中去,a指向的内容遇到空字符,然后停止。依次只有当a遇到'00'的时候就会停止了,二进制00(要连续两个0)在ascii表中就是‘/0’,只会将'01'/'01'/'00'依次拷贝到buf[0]/buf[1]/buf[2]中去,buf就会变成这样:
然后回到题目中:strlen(buf)很明显结果为2,因为buf[2]='00',strlen遇到它就停止计算(主要的bug就是strcpy和strlen在遇到连续两个0=‘/0’时会停止),依次buf[2]前只有两个字符。差不多了,可以得出结论输出为2了。当然这是在小端机器上的结果,如果对于大段存储的机器,那么得到的结果strlen(buf)就是0了。