栈与系统的设计有关,由系统来打点。不外,措施员可以通过如new malloc语句在堆中获取内存。
栈是向下发展的一块持续的内存区域。栈的巨细是系统配置好的。堆是向上发展,不持续的内存区域。因为操纵系统是用链表来打点内存的。
堆的巨细受系统有效虚拟内存的限制。
栈: 在函数挪用时,第一个进栈的是主函数中函数挪用后的下一条指令的地点,然后是函数的各个参数,留意静态变量是不入栈的。当本次函数挪用竣事后,局部变量先出栈,
然后是参数,最后栈顶指针指向最开始存的地点,也就是主函数中的下一条指令,措施由该点继承运行。
堆:堆中的详细内容有措施员布置。
一般举例
int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); 堆 p2 = (char *)malloc(20); 堆 } int main(){ char *p1="helloworld"; char *p2="helloworld"; char p3[]="helloworld"; char p4[]="helloworld"; printf("0x%08x\n",p1); printf("0x%08x\n",p2); printf("0x%08x\n",p3); printf("0x%08x\n",p4); } 输出功效: test@ubuntu:~$ ./a.out 0x0040072c 0x0040072c 0xc3340450 0xc3340460
因为指针p1,p2所指向的数据存储在常量区域,又因它们是数值沟通,所以p1,p2的值是沟通的。
p3,p4固然内容沟通,可是它们是栈上的字符数组所有地点是差异。
From:csdn博客 muge0913