梓益C语言学习笔记之链表&动态内存&文件
梓益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语言学习笔记之链表&动态内存&文件相关推荐
- 梓益C语言学习笔记之指针
梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...
- R语言学习笔记(八)--读写文件与网络爬虫
R语言学习笔记(八) 1 工作路径 2 保存R对象 3 Scan函数 3-1 从控制台读取数据 3-2 从txt文件读取数据 3-3 从url读取数据 4 按行读写文本文件 5 读取文本文件(txt. ...
- C++ Primer Plus学习笔记之类和动态内存分配
前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...
- c语言遍历文件内容_C语言学习第28篇---动态内存分配剖析
为什么C语言要动态分配内存的意义? 1.C语言中的一切操作都是基于内存的 2.变量和数组都是内存的别名 ---内存分配由编译器在编译期间决定的 ---定义数组的时候必须指定数组长度 ---数组长度是在 ...
- C++学习笔记-DLL中动态内存管理
动态内存管理 在dll中malloc的内存,必须在dll中free 注:这是由Windows自己的特点决定! 如果 a 编译成静态库,有下面两种解决方法: 1.b.dll 和 c.dll 使用同一个款 ...
- codesys工程ST语言学习笔记(五)打开压缩文件projectarchive失败,指定的工程不能被加载
codesys解压文件projectarchive失败 不会编译程序或者建立工程的点击第一篇文章codesys工程ST语言学习笔记(一)建立工程与编译 不会编译程序或者建立工程的点击第一篇文章code ...
- C语言如何加缓冲,C语言学习笔记之输出缓冲
在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...
- 数据结构(C语言版)学习笔记2-单链表
数据结构(C语言版)学习笔记2-单链表 1.单链表定义 typedef int ElemTypes; typedef struct node {ElemTypes data; //数据域struct ...
- 史上最全C语言学习笔记
最全C语言学习笔记 学习目标 学习编程最主要目标 分析问题的能力.构造算法的能力.编程的能力. 调试程序的能力. 学习方法手段 如何操作? 解题思路:重点要放在解题的思路上 一开始就要学会看懂程序,编 ...
最新文章
- 要不要读博?机器学习博五学生和强化学习博士展开了一场battle
- 如何反转 Python 中的字符串
- boost::hana::front用法的测试程序
- HTTP_响应消息_响应头
- javascript --- 再识闭包
- angular路由传递参数_Angular路由——在路由时候传递数据
- MongoDB与MySQL效率对比
- echarts echarts.js:440 Uncaught TypeError: Cannot read properties of null (reading ‘toFixed‘)
- 查不到元素_浓重中国元素游戏的本地化地狱
- rs232无线串口服务器,低成本WIFI串口服务器
- java源码编译指令
- 10.6 全源(All pairs)负权Johnson算法
- 计算机组成原理中CPI、MIPS、CPU执行时间、主频等计算
- python爬取网易动态评论
- ShareTech大企业邮件服务器系统软件
- 视频剪辑怎么学?四个方面要注意,整体思路是关键
- raised exception class EAccexxViolation with ‘Access violation at address 45EFD5 in module 出错
- div p、divp、div+p、div~p、div.a 、p,span的用法和区别
- HTML5——HTML5元素周期表
- Orleans 2.0 官方文档 —— 3.1 核心概念 - 什么是grain