摘要: 栈是从高地址向低地址方向增涨,堆的方向相反。在一次函数调用中,栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量,接下来,就在栈中开辟相应的空间以构造变量。在C语言程序中,参数的压栈顺序是反向的。比如func(a,b,c)。在参数入栈的时候,是:先压c,再压b,最后a。在取参数的时候,由于栈的先入后 出,先取栈顶的a,再取b,最后取c。C语言是不作栈溢出检查,如下代码可以正常编译运行。#include<stdio.h>main(){ char buf[2]; printf("enter a string shorter than 2.\n"); sca 阅读全文
posted @ 2012-10-07 15:14 张朝阳 阅读(11577) 评论(2) 推荐(3) 编辑
摘要: 字节序小端字节序(Little Edian)指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处。比如整形1在内存中的存放情况是:而换成大端字节序(Big Edian)则是:基于Intel X86的体系结构的PC机是小端字节序,我们可以写一个程序来验证。#include<stdio.h>main(){ int num=1; int c=num>>24; printf("%d\n",c); c=num & 0xff; printf("%d\n",c);}输出0和1。我们知道union中只存储一个成员变量,union的 阅读全文
posted @ 2012-10-07 11:32 张朝阳 阅读(2189) 评论(0) 推荐(0) 编辑
摘要: 在没有#pragma pack宏的情况下,结构体中的变量存储遵循以下对齐原则:原则一:第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从其自身大小的整数倍开始。原则二:结构体的总大小,也就是sizeof的结果,必须是其内部最大数据成员的整数倍,不足的要补齐。原则三:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大数据成员大小的整数倍地址开始存储。上面提到的“数据成员”均指基本数据类型。#include<stdio.h>struct A{ char c; int i; short s; };struct B{ int i; char c; shor 阅读全文
posted @ 2012-10-07 11:02 张朝阳 阅读(2167) 评论(0) 推荐(0) 编辑