ls0f / my-issues

0 stars 0 forks source link

很有意思的输出 #23

Open ls0f opened 8 years ago

ls0f commented 8 years ago

看下面这个程序会输出什么?

#include<stdio.h>

int main()
{
        int a = 0x636261;
        char str[3] = {'a', 'b', 'c'};
        printf("%s\n", str);
        return 0;
}

答案是abcabc

首先需要知道Linux的内存布局。函数内定义的变量位于栈,栈是向下增长的(堆是向上增长的)。astr都是位于栈内,astr的高地址。

C语言输出字符串的规则是直到碰到\0才会停止。因为str没有\0字符串,所以输出字母c后依然会向高地址继续。因为我的机器是小端字节序,下一个bit存储的是0x61(变量a的低地址)也就是字母a,然后继续0x620x630x00,碰到0x00后,也就是\0,停止输出。

'\0' is defined to be a null character - that is a character with all bits set to zero.

所以程序会输出abcabc。

如果机器是大端序,应该是输出abc。(等有机会再验证下)

http://www.geeksforgeeks.org/memory-layout-of-c-program/