栈:局部变量,程序运行期间变量大部分都是有栈分配的,内存空间比较小,系统自动回收资源。
堆:堆空间比较大,可以有程序员自由自配,只能手动申请和释放
(malloc()申请的空间在堆上,由free()释放掉)
malloc和free必须成对出现。。段错误:
指针:常量指针/NULL/野指针
数组:数组的越界访问,访问到非法区或者修改了其他的变量
其他:
内存不足
双释放
内存泄漏
栈和队列
top->栈顶指针
栈:先进后出
队列:后进后出
- 压栈:push();
- 出栈:pop();
每次压栈一次top向上一位。
当栈顶指针top在栈顶时,满栈!!!
每出栈一次top向下移一位。
例如:
a,b,c,d,e按顺序压入栈中:
不可能的出栈顺序:
A:abcde
B:edcba
C:decab
D:decba - 宏
条件预编译:
#if 表达式
#else
#endif
文件
-:普通文件
d:目录文件
l:链接文件
p:管道文件
b:块设备文件
c:字符文件
(1)文件系统
文件信息:索引节点(index)
文件操作:文件描述符(fd)
fd最大值
早期的Unix系统: 1024
linux系统: 65535
(2)文件的定义
一组相关数据的有序集合,称为文件!
(3)文件的打开和关闭
打开:fopen(文件名,属性);
关闭:fclose(文件指针);
- 注:
文件不关闭,则会造成数据的丢失
文件指针:
文件指针结构体:FILE
包含了文件的基本信息
定义文件指针
FILE *指针变量名;
文件名:可以是已存在的,也可以是不存在的
属性:
r(读) w(写) a(追加)
+: 可读写
t : 文本文件
b: 二进制文件
rt,wt,at,rb,wb,ab,rt+,wt+,at+,rb+,wb+,at+
r,r+
w,w+
a,a+
rt+/wt+:可读写
rt/rb:只读
wt/wb:只写,带w属性的,可以写文件,若文件已存在,则清空,
重新建立文件;若不存在,则以给定文件名创建文件;
r:带r属性的文件,文件必须存在!!!
(4)文件的操作
fgetc()/fputc():字符读写函数
fgets()/fputs():字符串读写函数
fsanf()/fprintf():格式化读写函数
fread()/fwrite():块读写函数
- 注
重点掌握fscanf()/fprintf()或者fread()/fwrite()至少掌握一种
在C89标准中,fread()/fwrite()有BUG!!!
文件结束标志:EOF(end or fail)
- 5.
fgetc()/fgets()
fgetc(文件指针)
;//从给定文件中读取一个字符
fgutc(ch,文件指针)
;//添加一个字符到指定文件中 - 6.fgets()/fputs()
fgets(字符数组/字符串常量/指针,size,fp)
;
从fp获得size-1长度,在末尾加"\0"
碰到“EOF”或者换行符结束;
arr可以是字符数组,或者字符串常量,
fputs(arr,fp)
;
将字符串写入到fp中!!!
stdin: 标准输出---->键盘
stdout:标准输入----->终端
stderr:标准输出----->终端
- 7,
fscanf(fp,"格式",参数列表)
fprintf(fp,"格式",参数列表)
#include<stdio.h>
void fscanf_file()
{
FILE *fp = fopen("123.txt","r");
if(NULL == fp)
{
perror("open failed!\n");
return;
}
int ID;
char buf[32] = {0};
fscanf(fp,"%d,%s",&ID,buf);
//输出文件内容 和fprintf的占位符格式必须一一对应
printf("ID = %d\tname = %s\n",ID,buf);
fclose(fp);
);
}
int main()
{
FILE *fp = fopen("123.txt","w+");
if(NULL == fp)
{
printf("open failed!\n");
return -1;
}
int num = 124;
char name[32] = "helloo";
//格式化写入(按一定格式输入)
fprintf(fp,"%d,%s",num,name);
fclose(fp);
// fscanf_file();
return 0;
}
读取时是什么格式,输出时必须是同样的格式
8.fread()/fwrite() //块读写函数
fread(address,size,count,fp);//读
<-------------
fwrite(address,size,count,fp);//写
--------------->
address:为指针类型,一般为结构体类型
sizeof():一般为结构体类型的大小;
count:一般为1
fp:文件指针
#include<stdio.h>
#include<string.h>
typedef struct student
{
int ID;
char name[32];
}STU;
void struct_write(STU temp)
{
FILE *fp = fopen("struct_read.txt","w+");
if(NULL == fp)
{
perror("open failed!!\n");
return;
}
fwrite(&temp,sizeof(STU),1,fp);
rewind(fp);
STU stu;
fread(&stu,sizeof(STU),1,fp);
printf("ID = %d\nname = %s\n",stu.ID,stu.name);
fclose(fp);
}
int main(int argc,char *argv[])
{
STU stu;
stu.ID = 123;
strcpy(stu.name,"defdf");
struct_write(stu);
return 0;
}