寒假在家,想趁这个机会好好的补一下自己的C语言功底。毕竟以后要是嵌入式方向的话,C语言是非常重要的。课程中老师的一句话也是让我印象非常深刻:C语言的核心思想其实就是对内存的各种操作。
很庆幸我在网上看到了这门课,并且在慕课网上是免费的。个人感觉老师讲的非常好,通俗易懂,由浅入深。这也是算得上我在网上唯一一个看完全部课程视屏的网课吧,一共23节课,总共大概5个小时。断断续续的看了三天。其中一方面加深了以前的知识点,另一方面也解决了之前很多的疑惑。总之就是这门课很适合那些C语言还不是很扎实的同学学习。
这是课程地址:C语言内存操作
前面几节课讲的比较基础,就没有很细致的做笔记。下面记录一下最后几节课的一些笔记。
首先C语言操作的整块内存大致可分为一下4个部分。
【高地址0XFFFFFFFF】
-------------------------------------------------4G
内核空间 应用程序不允许访问
-------------------------------------------------3G
运行时的栈空间 局部变量
---------------------------------------------------
运行时的堆空间 malloc的空间
---------------------------------------------------
全局的数据空间(初始化、未初始化) 全局变量
只读数据段 定义的字符串之类
代码段 code
--------------------------------------------------0G
【低地址0X00000000】
函数大括号内部的所有局部变量在此函数被运行时都保存在栈空间中,函数被运行时,会在栈内存中开辟一段空间,当函数运行结束时,该段栈空间就被销毁。
不同的函数可以定义相同名称的静态变量,原因就是对于静态变量,其实他们都有各自的后缀名用以区分。静态变量在函数结束后不会被销毁,且其存在data区或者bss区。
只读空间:是贯穿整个程序执行周期的。
栈空间:运行时,函数内部使用的变量,函数一旦返回该空间就释放,生存周期是函数内。
堆空间:运行时,可以自由、自我管理的分配的空间,生存周期是由程序员决定。
堆空间的分配和释放:
分配:malloc()函数:
#include <stdlib.h>
void *malloc( size_t size );
一旦成功执行,就返回分配好的地址给我们,只需接收其返回值。对于这个地址的读法,由程序员灵活把握。输入参数制定分配内存的大小,单位字节。int *p = (int *)malloc(100);
在使用该函数时一般会加上这个判断:
if(p == NULL){error;}
释放:free(p);使用malloc一般和free配对使用。如果没有释放的话,可能会出现内存泄露问题。
之前也是不知道内存泄露到底是个什么情况,现在就来解决这个问题
1、内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
2、内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。
C语言把内存交给程序员分配,这个活是一把双刃剑,利用好了能很好的提高自己程序的效率,利用不好真的是各种内存问题。所以搞C语言,基础只是还是要扎实啊。