C语言定义的整形、浮点型、字符型、数组变量都存放在栈空间中,而栈空间的大小在编译时是确定的,如果需要使用长度不固定的数组,就需要用到堆空间。
相同点:
栈空间和堆空间都在进程地址空间内(程序启动才叫进程,程序是放在磁盘上的有序的指令集合)
不同点:
(1)栈是计算机系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈 *** 作、出栈 *** 作都有专门的指令执行,这就决定了栈的效率比较高;堆则是C/C++函数库提供的数据结构,它的机制比较复杂,效率也不如栈。若使用的空间是固定的,则使用栈,若使用的空间不固定,则使用堆。
(2)栈空间会随着函数的执行结束而释放,堆空间不会随着子函数的结束而释放,必须自己free。
使用malloc动态申请空间(堆空间)
声明:
void *malloc(size_t size)
参数:
size_t 可以看作int型
size - 内存块的大小,以字节为单位,如size=20,则可以存储19个char型数据+1个’’,换成int型就只能存储4个整形数据。
返回值:返回一个(void *)指针,指向已分配大小的内存,如果请求失败,返回NULL。注意接受时注意强制类型转换。
使用完malloc申请的空间后,要及时释放,使用函数free()。需要注意的是,free§中p的值必须和最初malloc返回的值一致,不能发生偏移。(如果在编程中需要p发生偏移,可以多定义一个指针变量p1=p,改动p1即可)
在释放完成后,还需要将p=NULL,否则p将成为野指针
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)