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
在这里插入代码片

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值