梓益C语言学习笔记之链表&动态内存&文件
梓益C语言学习笔记之链表&动态内存&文件
创新互联公司于2013年成立,先为金牛等服务建站,金牛等地企业,进行企业商务咨询服务。为金牛企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
一、定义:
链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构。
二、特点:
链表由一系列节点(链表中每一个元素称为节点)组成,节点在运行时动态生成(malloc),每个节点包括两个部分:
存储数据元素的数据域
存储下一个节点地址的指针域
如:
typedef struct student
{
int num;
char name[20];
struct student *next;
}STU;
三、动态内存申请
在实际的编程中,有时所需的内存空间取决于实际输入的数据,无法预先确定 ,所以需要动态的分配内存空间,同时把不再使用的空间回收再次利用。
如链表的内存就需要动态申请
1.静态分配&动态分配
静态分配
在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。如:int a [10]
必须事先知道所需空间的大小。
分配在栈区或全局变量区,一般以数组的形式。
按计划分配。
动态分配
在程序运行过程中,根据需要大小自由分配所需空间。
按需分配。
分配在堆区,一般使用特定的函数进行分配。
通常使用malloc函数 void *malloc(unsigned int size); 在堆区分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。
函数返回void*指针,使用时必须做相应的强制类型转换
分配的内存空间内容不确定,一般使用memset初始化。
使用完以后,要记得用 free()函数 释放内存
返回值:分配空间的起始地址 ( 分配成功 )
NULL ( 分配失败 )
注意
1、在调用malloc之后,一定要判断一下,是否申请内存成功。
2、如果多次malloc申请的内存,第1次和第2次申请的内存不一定是连续的
例:
#include
#include
#include
int main()
{
int count,*array,n;
printf("请输入您要申请的数组元素个数\n");
scanf("%d",&n);
array=(int *)malloc(n*sizeof(int));
if(array==NULL)
{
printf("申请内存失败\n");
return 0;
}
memset(array,0,n*sizeof(int));
for(count=0;count { array[count]=count; } for(count=0;count { printf("%d\n",array[count]); } free(array);//释放array指向的内存 return0 } free 函数(释放内存函数) 头文件:#include 函数定义:void free(void *ptr) 函数说明:free函数释放ptr指向的内存。 例: char *p=(char *)malloc(100); free(p);// 注意 1、free后,因为没有给p赋值,所以p还是指向原先动态申请的内存。但是内存已经不能再用了,p变成野指针了。 2、一块动态申请的内存只能free一次,不能多次free 四、文件 文件就是存放在磁盘上的,一些数据的集合。 1.行缓冲: 标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的 行缓冲只有下面几种情况才刷新缓冲区 1-缓冲区里有换行符 "\n" 2-缓冲区满了,自动刷新缓冲区 如:while(1) { printf("hello world "); } 3-人为刷新缓冲区 fflush(stdout) 4-程序正常结束,刷新缓冲区return 0; 2.全缓冲: 标准io库函数 往普通文件读写数据是全缓冲的, 碰到换行符也不刷新缓冲区 1.缓冲区满了,刷新缓冲区 2.人为刷新缓冲区 fflush(文件指针) 3.程序正常结束刷新缓冲区 3.无缓冲: 在读写文件的时候通过系统调用io (read write),对文件进行读写数据是无缓冲的,即写数据会立马进入文件,读数据会立马进入内存 4.写文件的流程: 应用程序空间-(内核空间 -(驱动程序--(硬盘 应用程序和内核程序运行在不同的空间里,目的是为了保护内核。 通过缓冲可以减少进出内核的次数,以提高效率。 5.常用文件操作: 5.1打开文件:FILE *fopen(const char *path, const char *mode); FILE *fp; fp=fopen(“./test.txt”,”r”); 5.2关闭文件:int fclose(FILE *fp); 例: #include int main() { FILE *fp; int ret; fp=fopen("./test.txt","r+"); if(fp==NULL) { perror(“fopen”); return 0; } fclose(fp); return 0; } 5.3文件定位: rewind 复位读写位置 把文件内部的位置指针移到文件首 rewind(fp); ftell 测文件读写位置距文件开始有多少个字节 int length; length = ftell(fp); fseek 定位位置指针(读写位置) fseek函数(一般用于二进制文件即打开文件的方式需要带b) int fseek(FILE *stream, long offset, int whence); //int fseek(文件类型指针,位移量,起始点); 参数: whence起始位置 文件开头 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2 offset位移量: 以起始点为基点,向前、后移动的字节数,正数往文件末尾方向偏移,负数往文件开头方向偏移。 例: fseek(fp,50,SEEK_SET) fseek(fp,-50,SEEK_END); fseek(fp,0,SEEK_END);
文章标题:梓益C语言学习笔记之链表&动态内存&文件
本文链接:http://scyanting.com/article/gcgcjo.html