C语言中一些关于内存四区的归纳
博文参考传送门
一、综述
C语言程序中,代码是放在内存中执行的,我们大致将程序所占用的内存分为四个区域:
-
栈区 堆区 数据区 代码区
每个程序都有唯一一个内存四区,我们应该掌握各个区域的特性,例如存储哪种类型的数据,由谁去申请开辟,又由谁去管理释放等等。
二、内存四区介绍
1. 栈区
由编译器自动分配释放,比如存放函数的参数值,局部变量等。
例如:
void recive(int a,int b) {
int c;
}
其中,参数a,参数b和变量c都是存放在栈区,当函数执行完毕的时候,它们占有的空间自动释放。
2. 堆区
一般由程序员分配释放(如动态内存申请<malloc函数>),若程序员不释放,程序结束时可能由操作系统回收。
例如:
char *src;
src = (char*)malloc(4 *sizeof(char));//动态分配内存,表示查找可用的连续4个字节内存的空间,并将该内存首地址强制转换为指向字符数据的指针赋给scr,为src这个指针变量分配4个char类型的空间。
3.数据区
分为两种:1、常量区:存放常量,一般是字符串常量。
2、全局区(静态区):存放全局变量和静态变量。
该区域是在程序结束后由操作系统释放。
4.程序代码区
这个区域存放函数体的二进制代码,也是由操作系统进行管理。
三、划分内存四区的意义
C语言程序中,根据是局部变量,全局变量,常量还是其他,通过malloc等类似的函数分配内存空间,把他们放到对应的内存区中,这样就赋予了这些变量或常量不同的生命周期。
根据我们程序的需要,我们在编写代码过程中,声明不同的变量类型,使他们有不同的声明长度,不同的释放方式,可以让我们更加灵活地编程。
四、内存四区的一个实例
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
char* p1[3]= {"abc","def","ghi"};
char p2[3][4]= {"123","456","789"};
char** p3= (char**)malloc( 3 * sizeof(char*));
for(i=0;i < 3;i++)
{
p3[i]= (char *)malloc ( 5 * sizeof(char));
sprintf(p3[i],"%d%d%d",i,i,i);
/*
sprintf()函数:最常见的应用之一是把整数打印到字符串中
例如:
srpintf(s,"%d",123);
输出为:"123"
输出结果不会打印在屏幕上,而是写入字符串中
*/
printf("%s\n",p3[i]);
/*
printf()函数才将结果输出到屏幕上
*/
}
free(p3);
return 0;
}
网友评论