C语言基础-内存篇
文章平均质量分 68
ipmux
这个作者很懒,什么都没留下…
展开
-
内存篇之堆与栈的绕口令
堆(heap)/栈(stack或call stack)是两块功能完全不同的系统内存区,堆内存是由malloc/free函数动态申请和回收,而栈则是编译器与启动代码或线程创建代码配合,约定用CPU某寄存器标识最新使用位置的一段内存(所以分系统栈与任务栈,见后文)。但不知是谁添乱,用“堆栈”这个词代表“栈”的含义,导致中文里“堆“、“栈”和“堆栈”混在一起,三者的关系就象绕口令,“堆为堆,栈是栈,堆栈原创 2013-12-23 21:54:52 · 1289 阅读 · 0 评论 -
内存篇之越界访问
由于C语言指针高度灵活和自由,导致内存操作中陷阱很多,比如之前的堆泄漏,栈溢出,野指针等,此外还有一种常见的“内存访问越界”错误。广义讲,栈溢出也属于内存越界,只是对同一问题站在不同角度的说法。下面看几个内存越界的例子: void test1() { char string[10]; char* str1 = "0123456789";原创 2013-12-25 19:03:56 · 3822 阅读 · 0 评论 -
内存篇之野指针
前面两文中内存错误释放以及错误访问指向栈的指针,从另外角度,其中一部分错误还可以归结为访问了野指针。野指针又称悬挂指针,代表那些指向不可用内存区域的指针。操作野指针,程序会发生难以预料的错误。形成野指针主要有以下原因: 1)指针没有初始化。指针变量创建时不会自动指向null,其缺省值是随机的,比如: int *p; *p = 0; 这种代码可能导致死机或者非法操原创 2013-12-25 18:58:11 · 1247 阅读 · 0 评论 -
内存篇之栈溢出
“溢出”这个词很生动,水满则溢,前面说过栈就象一个容器,容器装满了,还要往里装东西,当然就会溢出了。 有两种不同情景都被称为栈溢出,一种是栈中的数据被越界覆盖,wiki中称这种情况为stack buffer overflow。一种常用的黑客攻击手段--栈溢出攻击,就是通过栈越界访问,用事先设计好的数据覆盖正常栈里的内容。比如把保存函数返回地址的栈内存用某段黑客代码的地址覆盖,函数结束时不原创 2013-12-24 17:36:53 · 15622 阅读 · 1 评论 -
内存篇之堆的错误释放
在我开始写程序时因为担心某些分支下忘记释放内存导致泄漏,就想能不能保险点,多加几次释放,但很快发现堆内存不能重复释放,一些错误释放甚至会导致系统崩溃。这类错误可分几种情况: 1)重复释放某指针指向的内存,多数由于调用了不同层的子函数重复释放同一内存,如: int* p = malloc(20); …… free (p); …… System_原创 2013-12-25 10:18:57 · 2619 阅读 · 0 评论 -
内存篇之指向栈的指针
下面程序运行有什么样的结果? char *GetString(void) { char array[6]; strcpy(array, “hello”); return array; } void main() { char *pstr = NULL; pstr = GetStr原创 2013-12-25 09:29:00 · 2947 阅读 · 0 评论 -
内存篇之堆泄漏
“堆泄漏”即常说的内存泄漏,是嵌入式软件里的常见问题,会导致软件运行一段时间后内存耗尽。 什么是”堆泄漏”? 内存分配和释放的操作是程序员根据需要动态随机发起,程序本身(或编译工具)无法自动判断某块已分配的内存什么时候不再被使用,必须由程序员自己手动调用free释放,以便为其他程序腾出空间。而一旦程序员忘记释放某块内存,它就不能回到可用内存,系统总的可分配内存就随之减少,这就是内存泄漏原创 2013-12-24 15:21:10 · 1765 阅读 · 0 评论 -
内存篇之静态与动态分配
经常听到诸如静态分配/动态分配以及静态库等类似表述,这些究竟是什么含义呢?老规矩,看看万能wiki上的定义: “The word static refers to things that happen at compile time and link time when the program is constructed--as opposed to load time or run ti原创 2013-12-24 13:13:45 · 1061 阅读 · 0 评论 -
内存篇之程序内存布局
程序内存布局是理解软件本质的基础要素。支持一个程序运行的所有内存大体可分为以下几部分,或者说程序运行需要系统为其提供如下几部分存储区域: 栈:由编译器自动分配释放,存放函数参数,局部变量等,特点为后进先出。 堆:程序员调用malloc/free进行内存动态分配和释放所操作的内存区域。 全局数据区(静态区):全局变量以及static变量存放的内存区,注意static变量原创 2013-12-24 12:50:25 · 1006 阅读 · 0 评论 -
内存篇之程序内存消耗评价指标
嵌入式软件除CPU占用率或者说运行速度外,内存方面还有三大量化评价标准,即ROM size, Peak memory occupation和 max stack depth,虽然不属于什么官方标准,但这三点的确综合反映了程序内存占用方面的整体指标。 rom size既不是指exe文件大小,也不是lib文件大小,而是目标文件中有效二进制段大小。exe和lib文件中都有一些辅助段,如文件头/原创 2014-03-07 10:38:38 · 3022 阅读 · 0 评论