sizeof的常用用法:
1、sizeof(arr) 类型*个数/int*p=arr sizeof(p) 只能是4或8
2、sizeof(arr[0])
3、sizeof(arr)/sizeof(arr[0])
*sizeof括号里不运算,结果是最大的
*变长数组不能初始化
*实参与形参之间是以赋值的方式进行传递数据的,并且是单向值传递 数组作为参数传递时,是"址传递"(首地址),相当于调用者与函数共享数组
****使用堆内存时需要注意的问题:****
内存泄漏:
内存无法使用,也无法被释放,当再次需要时只能重新申请,然后又重复以上过程,日积月累后会导致系统中可用的内存越来越少
(程序一旦结束,属于它的所有资源都会被操作系统回收)
*如何尽量避免内存泄漏:
谁申请的谁释放,谁知道该释放谁释放
*如何判断定位内存泄漏:
1、查看内存的使用情况
2、代码分析工具mtrace,检查malloc、free的使用情况
3、封装新的malloc和free函数,记录调用信息到日志中
内存碎片:
已经被释放但是又无法继续使用的内存叫做内存碎片,是由于申请和释放的时间不协调导致的,内存碎片无法避免只能尽量减少
*堆内存*
1、堆内存是进程的一个内存段(text、data、bss、stack、heap)
2、由程序员手动管理
3、特点是足够大,缺点是使用麻烦
*为什么要使用堆内存:
1、随着程序的复杂数据量变多
2、其它内存段的申请和释放不受控制,堆内存的申请释放受控制
缓冲区机制可以提高数据的读写速度,还可以让低速的设备与高速的CPU之间系统工作
程序要显示的数据并不会立即显示到屏幕上,而是先存储到输出缓冲区中,当满足一定条件时才会从输出缓冲区显示到屏幕上
*1、遇到'\n'
printf("------\n");
*2、遇到输入语句
printf();
scanf();
*3、当缓冲区满了4k
*4、程序正常结束时
*5、fflush(stdout); 手动刷新输出缓冲区