1。基本概念堆(Heap)程序可以动态申请的存储空间,通过malloc系列函数进行分配,可以全局访问。栈(Stack)这里说的栈不是数据结构中后进先出的栈,而是进程的虚拟地址空间的栈;程序调用函数时动态扩展的存储空间仅限于函数内的访问。-堆变量(Heapvariables)是数据存放在堆中,可以全局访问的变量。堆栈变量(Stackvariables)函数中声明的局部变量只能在函数内部访问,否则访问行为的结果是未定义的。指针参数(Pointerparameters)参数类型是指针参数。非指针参数(Non-pointerparameters)参数类型不是指针参数。2.进程的虚拟地址空间3.相关问题分析3.1如何正确分配内存演示代码void*fun_m1(){charbuf[100];return(void*)buf;}void*fun_m2(size_tsize){returnmalloc(size);}voidfun_m3(size_tsize,void*p){p=malloc(size);}voidfun_m4(size_tsize,void**p){*p=malloc(size);}解剖fun_m1是错误的,因为它返回的栈变量的地址,如果它指向的地址被读取或写入,程序行为的结果是未定义的,并且程序很可能会崩溃,因为此时栈变量的空间已经被回收了(栈顶指针变了)。fun_m2是正确的,因为它返回了malloc请求的堆空间的地址。fun_m3和fum_m4非常混乱。为了区分fun_m3和fun_m4的区别,这里需要明确一个概念:任何参数的传递本质上都是值的拷贝,任何参数都是栈变量。在我们之前的概念中,参数传递有两种:值传递和指针传递,通过指针可以改变指针指向的变量。为什么说参数传递是值拷贝呢?这是因为不管参数是不是指针,传递的都是值的拷贝,但是当你的参数类型是指针时,你传递的是指针变量的值,而通过作用于指针用*运算符来改变变量,你可以只影响与指针变量关联的其他变量的值。通过上面的分析,我们可以知道fun_m3是错误的,因为没有*运算符作用于p,对p的简单赋值操作只会影响局部栈变量p的值,不会对变量产生任何影响在函数fun_m3之外的影响。fun_m4是正确的,因为*运算符作用于p,通过给*p赋值修改传递给p的参数,使其指向申请的堆空间。3.2如何判断堆和栈的“增长”方向(从低到高,或者从高到低)判断栈的“增长”方向#include
