C语言_全局区(常量区)
这篇文章,我打算写清楚这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
在这里插入代码片
还没有评论,来说两句吧...