栈区写入内存的的顺序是先进后出。
由编译器管理数据开辟和释放
变量的生命周期在该函数结束后自动释放
不要返回局部变量的值,因为局部变量在函数执行之后就释放掉了,无法读取原来的内存
2、堆区的使用
堆区的空间远远大于栈区
它没有先进后出的数据结构
由程序员手动开辟和释放,malloc、calloc开辟free释放
注意:
如果主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中的指针分配内存
3.数据区放的是静态变量、全局变量以及常量
static静态变量: 编译阶段分配内存,只能在当前文件内使用,只初始化一次
ertern全局变量:C语言下默认的全局变量前都默认隐藏了该关键字
4.const修饰的变量
直接修改const修饰的全局变量:失败
简介修改const修饰的全局变量:失败,原因是放在常量区,受到保护
直接修改const修饰的局部变量:失败
直接修改const修饰的局部变量:成功,该局部变量其实放到了栈区,是伪常量
5.字符串常量
不同编译器的处理方式有所区别
ANSI并未指定它的修改方式
有些编译器可以修改字符串常量,但有些不可以,某些编译器将相同的字符串常量看做同一个字符串常量
6.void的使用方式
无类型,不可以创建变量,无法分配内存
限定函数返回值
限定函数参数列表
void*是万能指针,不需要强制转化就可以给其他指针赋值
7.sizeof的使用
sizeof的本质其实是一个运算符,类似于+-*/
当统计某类型占的空间时需要加()
当统计mou变量占的空间时无需加()
返回值的类型是无符号整形,即unsigned int
数组名称如果作为函数参数,会退化为指针,指向数组首元素
8.typedef的使用
它可以给类型起别名
简化struct关键字
区分数据类型
提高代码的可移植性
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。局部变量,任务线程函数之类的是放在(使用)栈里面的,栈利用率高一些。其操作方式类似于数据结构中的栈。特别,栈是属于线程的,每一个线程会有一个自己的栈。
2、堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。注意它和数据结构中的堆是两回事,分配方式倒是类似于链表,常见的就是malloc出来的都是属于堆区,就像固定出来的区域,到free的时候才释放,有点类似全局的,静态的。
扩展资料
栈内存是由编译器自动分配与释放的,它有两种分配方式:静态分配和动态分配。
1、静态分配是由编译器自动完成的,如局部变量的分配(即在一个函数中声明一个int类型的变量i时,编译器就会自动开辟一块内存以存放变量i)。
2、动态分配由alloca函数进行分配,但是栈的动态分配与堆是不同的,它的动态分配是由编译器进行释放,无需任何手工实现。
参考资料来源:百度百科—栈
参考资料来源:百度百科—堆