c语言内存相关

1:malloc 函数
void malloc(size_t size)
从堆里获得空间,向系统申请分配指定size个字节的内存空间,返回类型是void
类型,void表示未确定类型的指针,
void
类型可以通过类型转换强制转换为任何其它类型指针。
2:free函数
void free(void ptr)
释放指针指向的内存,而不是指针,ptr 指向一个要释放内存的内存块。
用法:
type p;
p = (type
)malloc(n
sizeof(type));
if(NULL == p) //判断有没有成功申请到内存
{
perror(“error…”);
exit(1);
}
free§; //不释放就会造成内存泄漏
p = NULL; //防止p为野指针
eg:
#include <stdio.h>

int *read(void)
{
	int *p_num = (int*)malloc(sizeof(int));
	if (p_num) {
		printf("请输入一个整数:");
		scanf("%d",p_num);
		}
return p_num;
}

int main()
{
	int *p_num = read();
	if (p_num) {
		printf("数字是%d\n",*p_num);
		free(p_num);
		p_num = NULL;
	}
return 0;
}

在read处理完成后到main函数read函数的局部变量,指针被释放掉。但是用malloc申请的内存不会被释放掉。
所以这个内存可以被任何函数使用。
eg:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int i1 = 10;-------全局区
int i2 = 20;-------全局区
int i3;-------------BSS段
const int i4 = 40;--------只读常量区
void fn(int i5)----------栈区
{
int i6 = 60;
static int i7 = 70;
const int i8 = 80;
int p = (int)malloc(4);---------p1指向堆区;p1本身在栈区
int p2 = (int)malloc(4);
char *str = “good”;--------str指向只读常量;str在栈区
char strs[] = “good”;--------strs在栈区
}

int main()
{
	pritf("代码区,fn = %p\n", fn);
	fn(10);
	return 0;
}	

进程中的内存划分:
1:代码区:存放程序的功能代码的区域,比如函数名
2:只读常量区:主要存放字符串常量和const修饰的全局变量
3:全局区:主要存放已经初始化的全局变量和static修饰的全局变量
4:Bss段:主要存放没有初始化的全局变量和static修饰的局部变量,BSS段会在main函数执行之前自动清零
5:堆区主要表示使用malloc/calloc/realloc等手动申请的内存空间,内存由程序员手动申请和手动释放
6:栈区主要存放局部变量(包括函数的形参,const修饰的局部变量,以及块变量,该内存区域由操作系统自动管理)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值