C语言中的内存分配和管理

1--C语言中的内存分区

图片博客地址:C语言:内存分配---栈区、堆区、全局区、常量区和代码区_堆内存和栈内存图解_根号五的博客-CSDN博客

 tips:我也想重新画一个的但是Windows自带的画图太难用了,尝试多次无果后,我选择借用别人的

        当我们在C语言中创建变量、函数等时,它们在计算机内存中被存储和管理。C语言的内存分区可以被大致分为以下几个部分:

栈(Stack)

  • 栈是一块连续的内存区域,用于存储函数的局部变量、函数的参数值、函数调用的返回地址等。
  • 当一个函数被调用时,会在栈上分配内存以存储该函数的局部变量和参数值;当函数执行完毕时,这些内存空间会被释放。
  • 栈是一种后进先出(LIFO)的数据结构,最后进入栈的数据会首先被移除。

堆(Heap)

  • 堆是用于动态内存分配的一块内存区域。在堆上分配的内存需要手动管理,包括分配和释放。通过函数如 malloc()、calloc() 或 realloc() 在堆上动态分配内存。这些内存块的大小和生命周期由开发者控制。
  • 堆上的内存分配通常比栈上的内存分配更灵活,但需要开发者负责管理它们,确保在不再需要时释放已分配的内存,以避免内存泄漏。

全局/静态存储区(Global/Static storage area):

  • 这个区域存储全局变量和静态变量。全局变量是在函数外部声明的变量,在整个程序执行过程中都存在,而静态变量在函数内部使用 static 关键字声明,其生命周期也跟全局变量相似。
  • 全局变量和静态变量在程序启动时被初始化,并在程序结束时销毁。
  • 在全局/静态存储区中分为.bss段和.data段,.bss段存放的是那些未初始化或者初始化为0的全局变量和静态变量,.data段存放的是已经初始化不为零的全局变量和静态变量

文字常量区(Text area):

  • 存储常量字符串和程序的机器码指令。常量字符串通常被存储在只读存储器中,因为它们的值在程序执行期间不会被改变。

代码区( Code area):

  • 程序的机器码指令被存储在代码区,这些指令在程序执行时被CPU执行。

        文字的描述比较抽象我们用一段程序来解释:

#include<stdio.h>

int a = 0;//全局初始化为0区,存放在.bss段    
int b = 1;//全局初始化区,存放在.data段 
char *p1;//全局未初始化区 
int main()
{
  int c;//c为局部变量,存放在栈区    
  char s[] = "abc";//s为局部变量,存放在栈区     
  char *p2;//栈    
  char *p3 = "123456";//123456/0在常量区,p3在栈上。    
  static int d = 0;//全局(静态)初始化区,存放在.bss段    
  p1 = (char*)malloc(10);//向堆上申请10个字节的空间,存放在堆上    
  p2 = (char*)malloc(20);//向堆上申请20个字节的空间,存放在堆上    
  strcpy(p1,"123456");//123456/0放在常量区,编译器可能会将它与p3所指向的"123456"  优化成一个地方。      
}

2--动态内存的分配方式

        在C语言中,动态内存分配是通过使用库函数 malloc()calloc()realloc()free() 来进行的。这些函数允许在程序运行时动态地分配和释放内存。

malloc() 函数

  • malloc() 函数用于分配指定字节数的内存空间,并返回一个指向分配内存起始位置的指针。
  • 语法:void *malloc(size_t size);
  • 例如:
int *ptr;
ptr = (int *)malloc(5 * sizeof(int)); // 为存储 5 个整数的内存分配空间

calloc() 函数

  • calloc() 用于分配一定数量、一定大小的内存空间,并将内存初始化为零。
  • 语法:void *calloc(size_t num, size_t size);
  • 例如:
int *ptr;
ptr = (int *)calloc(5, sizeof(int)); // 为存储 5 个整数的内存分配空间,并初始化为 0

realloc() 函数

  • realloc() 用于更改之前分配的内存空间的大小,可以扩大或缩小。
  • 语法:void *realloc(void *ptr, size_t size);
  • 例如:
int *ptr;
ptr = (int *)malloc(5 * sizeof(int)); // 为存储 5 个整数的内存分配空间
ptr = (int *)realloc(ptr, 10 * sizeof(int)); // 扩大为存储 10 个整数的内存空间

free() 函数

  • free() 用于释放之前动态分配的内存空间,将该内存标记为可用以供后续分配使用。
  • 语法:void free(void *ptr);
  • 例如:
int *ptr;
ptr = (int *)malloc(5 * sizeof(int)); // 为存储 5 个整数的内存分配空间
free(ptr); // 释放动态分配的内存空间

        需要注意的是一个malloc()需要对应一个free(),如果少了的话会造成内存泄漏,多了的话会引起程序崩溃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值