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

 

    摘要:  基本解释  1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。  2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。  3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。   问题:指针与数组  ......
 ·水滴石穿c语言之指针综合谈    »显示摘要«
    摘要:  概述  joel spolsky认为,对指针的理解是一种aptitude,不是通过训练就可以达到的。虽然如此,我还是想谈一谈这个c/c++语言中最强劲也是最容易出错的要素。  鉴于指针和目前计算机内存结构的关联,很多c语言比较本质的特点都孕育在其中,因此,本篇和第六、第七两篇我都将以指针为主线,结合在实际编程中遇到的问题,来详细谈谈关于指针的几个重要方面。  指针类型的本质分析  1、指针的本......


水滴石穿C语言之内存使用
  问题:内存使用

【程序编程相关:近期上网小心木马 假借圣诞祝福QQ消息传

【推荐阅读:大唐电信出资1182万元 进军MONS电

  有人写了一个将整数转换为字符串的函数: 【扩展信息:移动卫星宽带开通 上网费每兆流量7.8美

  如果我调用这个函数:char *str5 = itoa(5),str5会是什么结果呢?

  答案分析:

  答案是不确定,可以确定的是肯定不是我们想要的 “5”.

   retbuf定义在函数体中,是一个局部变量,它的内存空间位于栈(stack)中的某个位置,其作用范围也仅限于在itoa()这个函数中.当itoa()函数退出时,retbuf在调用栈中的内容将被收回,这时,这块内存地址可能存放别的内容.因此将retbuf这个局部变量返回给调用者是达不到预期的目的的.

  那么如何解决这个问题呢,不用担心,方法不但有,而且还不止一个,下面就来阐述三种能解决这个问题的办法:

  1).在itoa()函数内部定义一个static char retbuf[20],根据静态变量的特性,我们知道,这可以保证函数返回后retbuf的空间不会被收回,原因是函数内的静态变量并不是放在栈中,而是放在程序中一个叫“.bss”段的地方,这个地方的内容是不会因为函数退出而被收回的.

  这种办法确实能解决问题,但是这种办法同时也导致了itoa()函数变成了一个不可重入的函数(即不能保证相同的输入肯定有相同的输出),另外, retbuf [] 中的内容会被下一次的调用结果所替代,这种办法不值得推荐.

  2).在itoa()函数内部用malloc() 为retbuf申请内存,并将结果存放其中,然后将retbuf返回给调用者.由于此时retbuf位于堆(heap)中,也不会随着函数返回而释放,因此可以达到我们的目的.


...   下一页
 ·c语言程序设计基础之预处理    »显示摘要«
    摘要:  概述  在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令# include,宏定义命令# define等。在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分。   所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是c语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对......
» 本期热门文章:

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