c编程中的堆与栈
栈与系统的设计有关,由系统来打点。不外,措施员可以通过如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);
}
输出功效:
[email protected]:~$ ./a.out
0x0040072c
0x0040072c
0xc3340450
0xc3340460
因为指针p1,p2所指向的数据存储在常量区域,又因它们是数值沟通,所以p1,p2的值是沟通的。
p3,p4固然内容沟通,可是它们是栈上的字符数组所有地点是差异。
From:csdn博客 muge0913