存储类别和动态内存分配

作者:追风剑情 发布于:2019-11-28 19:47 分类:C

       存储类别和动态内存分配有何联系?我们来看一个理想化模型。可以认为程序把它可用的内存分为3部分:一部分供具有外部链接、内部链接和无链接的静态变量使用;一部分供自动变量使用;一部分供动态内存分配。

       静态存储类别所用的内存数量在编译时确定,只要程序还在运行,就可以访问储存在该部分的数据。该类别的变量在程序开始执行时被创建,在程序结束时被销毁。

       然而,自动存储类别的变量在程序进入变量定义所在块时存在,在程序离开块时消失。因此,随着程序调用函数和函数结束,自动变量所用的内存数量也相应地增加和减少。这部分的内存通常作为栈来处理,这意味着新创建的变量按顺序加入内存,然后以相反的顺序销毁。

       动态分配的内存在调用malloc()或相关函数时存在,在调用free()后释放。这部分的内存由程序员管理,而不是一套规则。所以内存块可以在一个函数中创建,在另一个函数中销毁。正是因为这样,这部分的内存用于动态内存分配会支离破碎。也就是说,未使用的内存块分散在已使用的内存块之间。另外,使用动态内存通常比使用栈内存慢

       总而言之,程序把静态对象、自动对象和动态分配的对象存在不同的区域。

示例

  1. //Visual Studio中加上这句才可以使用scanf()
  2. //否则只能使用scanf_s()
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7. //malloc()、free()
  8. #include <stdlib.h>
  9.  
  10. int static_store = 30;
  11. const char * pcg = "String Literal";
  12.  
  13. //argc: 参数个数 argv[]: 参数数组
  14. //int main(int argc, char **argv)
  15. int main(int argc, char *argv[])
  16. {
  17. int auto_store = 40;
  18. char auto_string[] = "Auto char Array";
  19. int * pi;
  20. char * pcl;
  21.  
  22. pi = (int *)malloc(sizeof(int));
  23. *pi = 35;
  24. pcl = (char *)malloc(strlen("Dynamic String") + 1);
  25. strcpy(pcl, "Dynamic String");
  26.  
  27. printf("static_store: %d at %p\n", static_store, &static_store);
  28. printf(" auto_store: %d at %p\n", auto_store, &auto_store);
  29. printf(" *pi: %d at %p\n", *pi, pi);
  30. printf("%s at %p\n", pcg, pcg);
  31. printf("%s at %p\n", auto_string, auto_string);
  32. printf("%s at %p\n", pcl, pcl);
  33. printf("%s at %p\n", "Quoted String", "Quoted String");
  34.  
  35. free(pi);
  36. free(pcl);
  37.  
  38. system("pause");
  39. return 0;
  40. }

运行测试

1111.png

如上所示,静态数据(包括字符串字面量)占用一个区域,自动数据占用一个区域,动态分配的数据占用第3个区域(通常被称为内存堆或自由内存)。

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号