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

2022-08-03 08:05:24

C/C++中的内存管理

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

int a=1;//数据段staticint staticA=1;//数据段void{staticint 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);//用于内存的释放
  • 作者:辉子吧
  • 原文链接:https://blog.csdn.net/weixin_43723598/article/details/89406075
    更新时间:2022-08-03 08:05:24