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

一、定义:

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

二、特点:

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

#include<stdio.h>

#include<string.h>

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<n;count++)

{

array[count]=count;

}

for(count=0;count<n;count++)

{

printf("%d\n",array[count]);

}

free(array);//释放array指向的内存

return0

}

free 函数(释放内存函数)

头文件:#include<stdlib.h>

函数定义: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<stdio.h>

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);

转载于:https://blog.51cto.com/13603157/2082832

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

  1. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  2. R语言学习笔记(八)--读写文件与网络爬虫

    R语言学习笔记(八) 1 工作路径 2 保存R对象 3 Scan函数 3-1 从控制台读取数据 3-2 从txt文件读取数据 3-3 从url读取数据 4 按行读写文本文件 5 读取文本文件(txt. ...

  3. C++ Primer Plus学习笔记之类和动态内存分配

    前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...

  4. c语言遍历文件内容_C语言学习第28篇---动态内存分配剖析

    为什么C语言要动态分配内存的意义? 1.C语言中的一切操作都是基于内存的 2.变量和数组都是内存的别名 ---内存分配由编译器在编译期间决定的 ---定义数组的时候必须指定数组长度 ---数组长度是在 ...

  5. C++学习笔记-DLL中动态内存管理

    动态内存管理 在dll中malloc的内存,必须在dll中free 注:这是由Windows自己的特点决定! 如果 a 编译成静态库,有下面两种解决方法: 1.b.dll 和 c.dll 使用同一个款 ...

  6. codesys工程ST语言学习笔记(五)打开压缩文件projectarchive失败,指定的工程不能被加载

    codesys解压文件projectarchive失败 不会编译程序或者建立工程的点击第一篇文章codesys工程ST语言学习笔记(一)建立工程与编译 不会编译程序或者建立工程的点击第一篇文章code ...

  7. C语言如何加缓冲,C语言学习笔记之输出缓冲

    在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...

  8. 数据结构(C语言版)学习笔记2-单链表

    数据结构(C语言版)学习笔记2-单链表 1.单链表定义 typedef int ElemTypes; typedef struct node {ElemTypes data; //数据域struct ...

  9. 史上最全C语言学习笔记

    最全C语言学习笔记 学习目标 学习编程最主要目标 分析问题的能力.构造算法的能力.编程的能力. 调试程序的能力. 学习方法手段 如何操作? 解题思路:重点要放在解题的思路上 一开始就要学会看懂程序,编 ...

最新文章

  1. 要不要读博?机器学习博五学生和强化学习博士展开了一场battle
  2. 如何反转 Python 中的字符串
  3. boost::hana::front用法的测试程序
  4. HTTP_响应消息_响应头
  5. javascript --- 再识闭包
  6. angular路由传递参数_Angular路由——在路由时候传递数据
  7. MongoDB与MySQL效率对比
  8. echarts echarts.js:440 Uncaught TypeError: Cannot read properties of null (reading ‘toFixed‘)
  9. 查不到元素_浓重中国元素游戏的本地化地狱
  10. rs232无线串口服务器,低成本WIFI串口服务器
  11. java源码编译指令
  12. 10.6 全源(All pairs)负权Johnson算法
  13. 计算机组成原理中CPI、MIPS、CPU执行时间、主频等计算
  14. python爬取网易动态评论
  15. ShareTech大企业邮件服务器系统软件
  16. 视频剪辑怎么学?四个方面要注意,整体思路是关键
  17. raised exception class EAccexxViolation with ‘Access violation at address 45EFD5 in module 出错
  18. div p、divp、div+p、div~p、div.a 、p,span的用法和区别
  19. HTML5——HTML5元素周期表
  20. Orleans 2.0 官方文档 —— 3.1 核心概念 - 什么是grain

热门文章

  1. STL Priority_Queue
  2. UA MATH571B 试验设计V 析因设计简介
  3. javascript添加HTML事件处理程序的两种方式学习
  4. matlab生成实指数序列、matlab茎状图
  5. NC命令行作为服务端、客户端以及win32 套接字程序的简单连接测试
  6. MyEclipse创建Java Web工程并添加Hibernate支持
  7. 搞定JSP第一个Servlet例子并且还是手动编译
  8. 软件测试人员需要了解关于自动化的什么(译)
  9. 游戏编程十年总结(下)(转)
  10. 【poj2187】 Beauty Contest