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(),如果少了的话会造成内存泄漏,多了的话会引起程序崩溃。