栈:
局部变量,程序运行期间的变量分配大部分是在栈空间分配,
函数结束后,系统自动回收资源,空间比较小,
堆:
堆空间比较大,可以由程序员自由支配,只能手动申请和释放
malloc申请的空间在堆上!
malloc()和free()要成对出现(即申请的堆空间要及时释放),
防止出现堆空间不足的现象
常见段错误:
指针:
常量指针/NULL/野指针
数组:
数组的越界访问,访问到非法区域或者修改了其它变量
其它:
内存不足,双释放,内存泄露
栈和队列
栈: 先进后出;
队列: 先进先出;
预编译
#if 表达式
//执行语句
#elif 表达式
//执行语句
#else
//执行语句
#endif
文件
-:普通文件
d:目录文件
l:链接文件
p:管道文件
b:块设备文件
c:字符文件
f:堆栈文件
(1)文件系统
文件信息:索引结点(index)
文件操作:文件描述符(fd)
fd最大值
早期的Unix系统: 1024
Linux系统: 65535
(2)文件的定义
一组相关数据的有序集合,称为文件
(3)文件的打开和关闭
打开:fopen(文件名,属性);
关闭:fclose(文件指针); -------->#include<stdio.h>
注:
文件不关闭,不然会造成文件数据的丢失或混乱
文件指针:
文件指针结构体:FILE
包含了文件的基本信息
定义文件指针
FILE *指针变量名;
文件名:可以是已存在的,也可以是不存在的,示属性而定
文件名可以加路径(绝对路径)
属性:
r(读) w(写) a(追加)
+:可读写
t:文本文件
b:二进制文件
rt,wt,at,rb,wb,ab,rt+,wt+,at+,rb+,wb+,at+
rt+/wt+:可读写
rt/rb:只读
wt/wb:只写,带w属性的可以写文件,若文件已存在,则清楚文件,重新写文件
若不存在,则以给定文件名创建文件
r:带r属性的,文件必须存在
(4)文件的操作
fgetc()/fputc():字符读写函数
fgets()/fputs():字符串读写函数
fscanf()/fprintf():格式化读写函数
fread()/fwrite():块读写函数
注:
重点掌握fscanf()/fprintf()或者fread()/fwrite()
至少掌握一种
在C89标准中,fread()/fwrite()由BUG!!!
文件结束标志:EOF(end of file)
(5)fgetc()/fputc()
fgetc(文件指针); //从给定文件中读取一个字符
fputc(ch,文件指针); //添加一个字符到指定文件中
(6)fgets()/fpus()
fgets(字符数组/字符串常量/指针,size,fp);
从fp获得size-1个长度,在末尾加'\0'
碰到EOF或者换行符结束
fputs(arr,fp);
将字符串写入到文件fp中
stdin:标准输入 键盘
stdout:标准输出 终端
stderr:错误输出 终端
(7)fascanf(fp,"格式",参数列表); //读文件
<--------------
fprintf(fp,"格式",参数列表); //写文件
-------------->
写入文件的时候是什么格式,读出来就是什么格式,不然会出错
(8)fread()/fwrite() //块读写
fread(address,size,count,fp); //读
<-------------
fwrite(address,size,count,fp); //写
-------------->
adress:地址
size:大小---->sizeof()/或者具体数值
count:读写的块数(一般情况下默认1)
fp:文件指针