经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言内存管理
来源:cnblogs  作者:等风南吹  时间:2018/12/20 9:39:03  对本文有异议

         这一节主要讲解了C语言里变量在内存中的位置,各种变量的使用区别,以及如何在堆栈中分配空间等C语言内存管理问题。

自动变量与静态变量

auto自动变量

    auto是默认的关键字,如实际中int a,实际为auto int a,{}内部的都是auto变量,不用为此类变量申请或者释放空间,它都是自动完成的。

register 变量

   例:register int a = 0;

   要使用register变量必须使用此关键字。

static 静态变量

   内存位置在程序执行期间一直不改变,一个代码的内部静态变量只能被这个代码块内部访问,函数里使用加载到内存时只会初始化一次,每次访问该函数时不会再初始化。

   例:static int b = 0;   

全局变量与静态变量

  全局变量的存储方式与静态变量相同,可以被多个文件访问,在{}之外的变量。

例:

  1. 1 //main.c
  2. 2
  3. 3 int a = 0;
  4. 4
  5. 5 Void main{}
  6. 6
  7. 7 // main1.c
  8. 8
  9. 9 extern int a;
  10. 10
  11. 11 Test(){
  12. 12 a…….}

    静态全局变量:只能在定义它的文件内部访问,在其它文件外部是不可以被访问的。

    对于函数在存在静态函数,表示该函数也只能在文件内部访问,不可以在文件外部访问。如果一个代码块之外的函数或者变量,C语言都默认是全局的,可以在其它文件被访问,除非有关键字static,静态函数始终在代码区,static只表示它对外部是否可见。

    例:static void test()

内存布局

代码区

    程序被操作系统加载到内存的时候,所有的可执行代码都被加载到代码区,也叫代码段,这块内存在运行期间是不可以被修改的,只可以被执行。

静态区

    所有的静态变量和全局变量都被放到了静态区,程序退出的时候消失,在运行期间都占用内存。

栈区

     所有的自动变量,函数的形参、返回值都是自动放入栈中,当一个变量超出其作用域时,自动从栈中弹出,不同系统的栈大小是不同的,windows操作系统是栈大小是可以设置的。C语言的形参是从左到右入栈的。

堆区

      堆是一个大容器,它的容量远远大于栈,操作也更加复杂。堆中分配的内存不会自动释放,需要用free手动释放。一个程序的栈大小是有限的, 一个数组太大有可能导致栈溢出,不要在栈里面定义太大的数组。如果使用一个特别大的数组,那么使用堆而不是栈;如果一个数组在定义时不确定大小,那么适合使用堆,不适用栈。Malloc如果分配内存不释放,就会造成内存泄漏。Windows操作系统堆每次分配的空间是4k,4K为一页,优点不用频繁调度资源,缺点是可能浪费了内存。

     void *malloc(int size_t); 

    例:char* =malloc(10);

    Malloc分配空间的初始值是不固定的。

函数返回一个指针

  1. 1 //例1:
  2. 2 int *test(){
  3. 3 Int *p = malloc(1*sizeof(int));//函数不能直接返回一个auto类型的地址
  4. 4 *p = 10;
  5. 5 Return p;
  6. 6 }
  7. 7 // 例2:
  8. 8 const char *test(){
  9. 9 Const char *s = hello”;
  10. 10 Return s;//意思是将s指向一个常量地址,常量在程序运行期间一直都是有效的。常量区和静态区是有效的,程序运行期间一直有效,但是常量区是只读的空间。
  11. 11 }
  12. 12
  13. 13 //例3:
  14. 14 const char *test(){
  15. 15 Returnhello world”;
  16. 16 }

 

堆空间实现动态大小变化的字符数组

  1. 1 //例:
  2. 2 char a[] = asfsb”;
  3. 3
  4. 4 char b[] = jhansdnfsdg
  5. 5
  6. 6 char *p = malloc(strlen(a)+strlen(b)+1);
  7. 7
  8. 8 strcpy(p,a);
  9. 9
  10. 10 strcat(p,b);

calloc与realloc的使用

  1. Void *calloc(size_t nmemb, size_t size)

    Malloc的参数是指定分配的大小,单位是字节。

    Calloc第一个参数是指定单位的数量,第二个参数指定一个单位的大小。

    例:用malloc分配10个int

    Int *p = malloc(10*sizeof(int));

    用calloc分配10个int

    Int *p = malloc(10,sizeof(int));

    以上两种写法分配堆空间的大小是一样的,malloc只负责分配空间大小,用memset负责清空;Calloc负责分配空间大小,同时负责将空间分配。

    Void *realloc(void *ptr, size_t size)

    Realloc在已分配的空间基础上,重新扩大或缩小这块空间。用realloc分配的空间也不会将新改变的空间清空。

通过指针形参分配内存的说明

  1. //例:
  2. void test(char *s){
  3. s =calloc(10,1);
  4. strcpy(s,”hello”);
  5. }//错误
  6. void test(char **s){
  7. *s =calloc(10,1);
  8. strcpy(*s,”hello”);
  9. }//正确

   当你想内部给形参分配空间时,形参一定是个二级指针。

   以上便是C语言内存管理的基本内容。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号