C/C++中的内存分布以及malloc/calloc/realloc

C/C++中的内存管理

C/C++中的内存分为:
1.栈:又叫堆栈,存放非静态局部变量/函数参数/返回值等,栈 是向下增长的。
2.内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,用做进程间的通信。
3.堆:用于程序运行时动态内存分配,堆是向上增长的。(区别于栈)
4.数据段:储存全局数据和静态数据。
5.代码段:可执行的代码/只读常量
例如:

int a=1;//数据段
static int staticA = 1;//数据段
void {
	static int staticVar = 1;//数据段
	int localVar = 1;
	int num[5]={1,2,3,4};
	char char1[10]="abcd";//“abcd”存放在代码段
	char* pchar2[]="abcd";//同上
	int* ptr1=(int*)malloc(sizeof(int)*4);//申请的空间是堆上的,堆属于向上增长
	int* ptr2=(int*)calloc(4,sizeof(int));//同上
	int* ptr3=(int*)realloc(ptr2,sizeof(int)*4);//同上
	//以上申请的int char int* char* 都是在栈上,但是他们所赋予的“值”不一定在栈上,比如“abcd”就在代码段,而malloc calloc realloc申请的空间都存放在堆上 
	}

- C语言中的内存申请
C语言中提供了三个动态内存开辟的函数
1.malloc:malloc是C语言提供的动态内存开辟的函数。
void* malloc(size_t size);
这个函数向内存空间(一般在堆上)申请一块连续可用的内存空间,并返回指向这块空间的指针

  • 如果开辟成功,则返回一个指向这块开辟好的空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查,看是否申请成功。
  • 返回值的类型是void*,所以malloc并不知道开辟空间的类型。
  • 如果参数size为0,malloc的行为是标准还是未定义的,取决于编译器。

2.calloc:calloc是C语言提供的另一个用于开辟内存的函数。
void* calloc(size_t num,size_t size);

  • 函数的功能是为num个大小为size的元素开辟一块空间,并把空间的每一个字节初始化为0。
  • 与函数malloc的区别在于calloc会在地址返回之前把申请的空间的每个字节初始化为0。

3.realloc:同样是C语言提供的另一个开辟内存的函数。
void* realloc (void* ptr,size_t size);

  • ptr 是要调整的内存地址

  • size是调整之后新的大小

  • 返回值为调整之后内存的起始位置。

  • 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。

  • realloc在调整内存空间的时候存在两种情况:
    情况一:原有空间之后有足够大的空间
    情况二:原有空间之后没有足够大的空间

  • 当是情况一的时候,要扩展内存在原有的内存之后直接添加内存即可,原来的空间的数据不发生改变,当时情况二的时候,原有空间之后的内存不足以扩容到需要的大小,那么就会:在堆上从新找一块合适大小的连续空间来使用。这样函数返回的是一个新的地址

free:有申请空间,当然就有释放空间,free函数就是用于释放不用的空间。比如:

int *p=(int *)malloc(100);
free(p);//用于内存的释放
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值