梓益C语言学习笔记之链表&动态内存&文件-创新互联

梓益C语言学习笔记之链表&动态内存&文件

创新互联建站凭借专业的设计团队扎实的技术支持、优质高效的服务意识和丰厚的资源优势,提供专业的网站策划、做网站、成都网站设计、网站优化、软件开发、网站改版等服务,在成都10余年的网站建设设计经验,为成都成百上千家中小型企业策划设计了网站。

一、定义:

链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构。

二、特点:

链表由一系列节点(链表中每一个元素称为节点)组成,节点在运行时动态生成(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);

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站题目:梓益C语言学习笔记之链表&动态内存&文件-创新互联
文章URL:http://pwwzsj.com/article/dpcgjh.html