当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 问题:内存使用 有人写了一个将整数转换为字符串的函数: 如果我调用这个函数:char *str5 = itoa(5),str5会是什么结果呢? 答案分析: 答案是不确定,可以确定的是肯定不是我们想要的 “5”。
 

 

    摘要:  基本解释  通过上一篇的分析,我们已经很清楚地知道:指针不是一个简单的类型,它是一个本身和所指向物相复合的类型。指针的算术运算(如步进)与指针所指向物的类型密切相关。   问题:指针步进 & 步进单位  下面的代码中打印出的结果是几?  答案与分析:  这段代码没有正确答案,因为这段代码是错的,printf将打出无法预测的内存区的值,其中的原因如下:  在c语言中,指针总是按照它所指向的对象的大小步进。在上面的例子中,par是指向整数类型变量的......
 ·c语言程序设计基础之文件    »显示摘要«
    摘要:  所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。   普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序; 也可以是一组待输入处理......


水滴石穿C语言之内存使用
上一页   ...  但是有这样一种情况需要注意:itoa()函数的调用者在不需要retbuf的时候必须把它释放,否则就造成内存泄漏了,如果此函数与调用函数都是同一个人所写,问题不大,但如果不是,则比较容易会疏漏此释放内存的操作。

【相关文章:.NET专家Richard Grimes

【扩展阅读:微软C#产品经理对Richard的回应

  3)、将函数定义为char *itoa(int n, char *retbuf),且retbuf的空间由调用者申请与释放,itoa()只是将转换结果存放到retbuf而已。 【扩展信息:用jfreechart来生成统计图表

  这种办法明显比第一、二种方法要好,既避免了方法1对函数的影响,也避免了方法2对内存分配释放的影响,是目前一种比较通行的做法。

  扩展分析:

  其实就这个问题本身而言,我想大家都可以立刻想到答案,关键在于对内存这种敏感资源的正确与合理地利用,下面对内存做一个简单的分析:

  1)、程序中有不同的内存段,包括:

  .data - 已初始化全局/静态变量,在整个软件执行过程中有效;

  .bss - 未初始化全局/静态变量,在整个软件执行过程中有效;

  .stack - 函数调用栈,其中的内容在函数执行期间有效,并由编译器负责分配与收回;

  .heap - 堆,由程序显式分配与收回,如果不收回就是内存泄漏。

  2)、自己使用的内存最好还是自己申请与释放。

  这可以说是一个内存分配与释放的原则,比如说上面解决办法的第二种,由itoa()分配的内存,最后由调用者释放,就不是一个很好的办法,还不如用第三种,由调用者自己申请与释放。另外这个原则还有一层意思是说:如果你要使用一个指针,最好先确信它已经指向合法内存区了,如果没有就得自己分配,要不就是非法指针访问。很多程序的致命错误都是访问一个没有指向合法内存区的指针,这也包括空指针。


    摘要:  在实际问题中, 有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月, 一个班每周有六门课程等等。如果把这些量说明为整型, 字符型或其它类型显然是不妥当的。 为此,c语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是, 枚举类型是一种基本数据类型,而不是一种构造类型, 因为它不能再分解为任何基本类型。   枚举类型的定义和枚举变量......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE