C语言---内存四区之全局区(常量区)案例

    科技2022-07-14  116

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

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

    内存四区

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

    全局区的使用

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

    全局区的使用

    #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> char * getstring1() { char *p1 = "abcde"; return p1; } char * getstring2() { char *p2 = "abcde"; return p2; } int main01() { int i = 0; char *p2 ; p2 = (char *)malloc(100); // 在栈中开辟一个100字节内存空间,并且地址赋给p2 strcpy(p2,"22222222222");// 把常量区的22222222地址赋给p2 printf(p2); if (p2 != NULL) { free(p2); p2 = NULL; } if (p2 != NULL) // # 传说中的野指针 { free(p2); } //char buf[100]; byte b1 = new byte[100]; //int a = 10; //分配4个字节的内存 栈区也叫临时区 //int *p;//分配4个字节的内存 //p = &a; //cpu执行的代码,放在代码区 //*p = 20; system("pause"); return 1; } void main() { char buf[100]; int i; system("pause"); return 1; } ```c ```c 在这里插入代码片
    Processed: 0.009, SQL: 8