c编程中的堆与栈2015-02-23栈与系统的设计有关,由系统来管理。不过,程序员可以通过如new malloc语句在堆中获取内存。栈是向下生长的一块连续的内存区域。栈的大小是系统设置好的。堆是向上生长,不连续的内存区域。因为操作系统是用链表来管理内存的。堆的大小受系统有效虚拟内存的限制。栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。堆:堆中的具体内容有程序员安排。一般举例
int a = 0; 全局初始化区char *p1; 全局未初始化区main(){int b; 栈char s[] = "abc"; 栈char *p2; 栈char *p3 = "123456"; 123456 在常量区,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
",p1);printf("0x%08x
",p2);printf("0x%08x
",p3);printf("0x%08x
",p4);}输出结果:test@ubuntu:~$ ./a.out0x0040072c0x0040072c0xc33404500xc3340460
因为指针p1,p2所指向的数据存储在常量区域,又因它们是数值相同,所以p1,p2的值是相同的。p3,p4虽然内容相同,但是它们是栈上的字符数组所有地址是不同。From:csdn博客 muge0913