c语言内存四区模型
更新时间:2024-01-13前言
在C语言中,内存被划分为四个区域,每个区域有其特定的功能和使用规则。这些区域分别是:栈(stack)、堆(heap)、全局/静态区(global/static)以及常量区(constants)。
栈(Stack)
栈是用于存储函数调用时的局部变量以及函数调用的上下文信息的区域。当函数被调用时,栈会为该函数分配一块区域,称为栈帧(stack frame),其中包含函数的参数、局部变量以及返回地址等信息。每当有新的函数调用发生时,新的栈帧会被压入栈顶,函数调用结束后,相应的栈帧会被弹出,释放栈空间。
void func() { int num = 10; // 局部变量 printf("%d", num); }
以上代码中,变量"num"是一个局部变量,它被分配在栈上。当函数"func()"被调用时,栈会为该函数分配存储空间,其中包含了变量"num"的存储位置。当函数调用结束后,栈会释放这部分空间。
堆(Heap)
堆是用于动态分配内存的区域。程序运行时,可以通过调用malloc()或者free()等函数来在堆中进行内存的分配和释放。与栈不同,堆上的内存空间可以手动地分配和释放,没有自动销毁的机制。
int* createArray(int size) { int* arr = malloc(size * sizeof(int)); // 动态分配内存 return arr; } void destroyArray(int* arr) { free(arr); // 释放内存 }
以上代码中,函数"createArray()"使用malloc()函数在堆上动态分配了一个整数数组的内存空间,并返回指向该内存空间的指针。函数"destroyArray()"使用free()函数释放了之前分配的内存。
全局/静态区(Global/Static)和常量区(Constants)
全局/静态区和常量区是用于存储全局变量、静态变量以及常量的区域。全局变量是在整个程序运行期间一直存在的,静态变量只在声明它的源文件内有效。常量包括字符串常量和其他不可修改的常量。
#includeint globalVariable = 10; // 全局变量 void func() { static int staticVariable = 5; // 静态变量 printf("%d", globalVariable); printf("%d", staticVariable); } int main() { char* str = "Hello, world!"; // 字符串常量 printf("%s", str); func(); return 0; }
以上代码中,变量"globalVariable"是一个全局变量,在整个程序运行期间都可以访问。变量"staticVariable"是一个静态变量,它只在函数"func()"内有效,但不会被销毁。变量"str"指向一个字符串常量,在常量区中存储。
总结
C语言中的内存分为栈、堆、全局/静态区和常量区。栈用于存储函数的局部变量和调用的上下文信息,堆用于动态分配内存,全局/静态区用于存储全局变量和静态变量,常量区用于存储常量。了解内存四区模型对于正确理解C语言的内存管理和变量作用域具有重要意义。