C语言_全局区(常量区)

╰+攻爆jí腚メ 2022-12-12 00:32 125阅读 0赞

这篇文章,我打算写清楚这2件事

  • 1,内存四区包含哪四区
  • 2,分别举例说明,在执行代码时,内存四区怎样处理

内存四区

栈区:存放函数的参数值,局部变量的值。
堆区:
全局区:包括静态区,常量区(存放字符串等常量)
代码区:把代码转换成二进制代码,存放二进制代码

全局区的使用

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. char * getStr1()
  6. {
  7. char *p1 = "abcdefg2"; // 系统运行这行代码一共干了三件事,1,在全局区开辟一个字符数据"abcdeff1"
  8. return p1; //2,在栈区开辟一个char* P1内存空间 3,执行=时,栈区的地址指向栈区p1
  9. // 当执行p1语句时,p1指向的被析构掉
  10. }
  11. char *getStr2() // 同样的道理,char *getStr2()也是执行了上面的三步
  12. {
  13. char *p2 = "abcdefg2"; // 编译器的优化功能:如果看到常量区有一个存在的常量,编译器则不会开辟新的常量,而是直接使用旧的变量。
  14. return p2;
  15. }
  16. void main()
  17. {
  18. char *p1 = NULL; // 在栈区开辟一个四个字节的内存空间
  19. char *p2 = NULL; // 再次开辟一个内存空间
  20. p1 = getStr1(); // 执行这一条语句时,把内存中char * getStr1()的P1地址,赋给了这个p1,同时释放掉了函数体的p1.
  21. p2 = getStr2(); // 执行这一条语句时,把内存中char * getStr1()的P2地址,赋给了这个p2,同时释放掉了栈中char * getStr1()的p1.
  22. //打印p1 p2 所指向内存空间的数据
  23. printf("p1:%s , p2:%s \n", p1, p2);
  24. //打印p1 p2 的值
  25. printf("p1:%d , p2:%d \n", p1, p2);
  26. printf("hello...\n");
  27. system("pause");
  28. return;
  29. }

在这里插入图片描述

全局区的使用

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. char * getstring1()
  6. {
  7. char *p1 = "abcde";
  8. return p1;
  9. }
  10. char * getstring2()
  11. {
  12. char *p2 = "abcde";
  13. return p2;
  14. }
  15. int main01()
  16. {
  17. int i = 0;
  18. char *p2 ;
  19. p2 = (char *)malloc(100); // 在栈中开辟一个100字节内存空间,并且地址赋给p2
  20. strcpy(p2,"22222222222");// 把常量区的22222222地址赋给p2
  21. printf(p2);
  22. if (p2 != NULL)
  23. {
  24. free(p2);
  25. p2 = NULL;
  26. }
  27. if (p2 != NULL) // # 传说中的野指针
  28. {
  29. free(p2);
  30. }
  31. //char buf[100];
  32. byte b1 = new byte[100];
  33. //int a = 10; //分配4个字节的内存 栈区也叫临时区
  34. //int *p;//分配4个字节的内存
  35. //p = &a; //cpu执行的代码,放在代码区
  36. //*p = 20;
  37. system("pause");
  38. return 1;
  39. }
  40. void main()
  41. {
  42. char buf[100];
  43. int i;
  44. system("pause");
  45. return 1;
  46. }
  47. ```c
  48. ```c
  49. 在这里插入代码片

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读