Open ls0f opened 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的内存布局。函数内定义的变量位于栈,栈是向下增长的(堆是向上增长的)。a和str都是位于栈内,a在str的高地址。
a
str
C语言输出字符串的规则是直到碰到\0才会停止。因为str没有\0字符串,所以输出字母c后依然会向高地址继续。因为我的机器是小端字节序,下一个bit存储的是0x61(变量a的低地址)也就是字母a,然后继续0x62、0x63、0x00,碰到0x00后,也就是\0,停止输出。
\0
c
0x61
0x62
0x63
0x00
'\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/
看下面这个程序会输出什么?
答案是abcabc。
首先需要知道Linux的内存布局。函数内定义的变量位于栈,栈是向下增长的(堆是向上增长的)。
a
和str
都是位于栈内,a
在str
的高地址。C语言输出字符串的规则是直到碰到
\0
才会停止。因为str没有\0
字符串,所以输出字母c
后依然会向高地址继续。因为我的机器是小端字节序,下一个bit存储的是0x61
(变量a的低地址)也就是字母a
,然后继续0x62
、0x63
、0x00
,碰到0x00后,也就是\0
,停止输出。所以程序会输出abcabc。
如果机器是大端序,应该是输出abc。(等有机会再验证下)
http://www.geeksforgeeks.org/memory-layout-of-c-program/