大家好,今天给各位分享深入解析C语言内存管理技巧的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
自动int a1=0; //如果不写auto,C语言默认的变量是auto,有符号的也是默认的
1.4 register寄存器变量
。通常变量都在内存中。如果能将变量放在CPU寄存器中,代码执行效率将会提高。会很高
寄存器int i=0; //建议如果有寄存器空闲,那么这个变量就应该放在寄存器中
int *p=$i; //报错,对应一个寄存器变量,无法进行地址操作。寄存器中的变量没有内存地址
1.5 静态变量
并且只初始化一次,而静态变量在程序运行过程中一直存在。代码块内的静态变量只能在代码块内访问
无效mystatic()
{
静态int a=0; //只执行一次,变量一直存在
//int a=0; //如果是自动变量,则总是从0开始。
printf("a=%dn",a);
一个++;
}
int main()
{
for (int i=0; i 10; i++){
mystatic();
}
}一旦全局变量被定义为静态,它只能在当前定义的文件内有效。
1.6 全局函数和静态函数
默认为全局函数。如果函数前面加上static,则表示该函数只能在当前文件内使用。
内存四区
int c=0 //静态区域
int main()
{
静态int d=0; //变量在静态区域
整数a=0; //变量在栈区
整数c=0; //变量在栈区
返回0;
}int *geta()
{
整数a=100;
返回一个;
}//int a从这个地方弹出
int main()
{
int *p=geta(); //这里我们得到临时堆栈变量的地址。函数geta调用完成后该地址无效,可能出现野指针错误。
*p=100; //可能会出现错误,一定要注意
printf("%dn",*p);
返回0;
}
1.1 代码区
当程序被操作系统加载到内存中时,所有可执行代码都被放置在代码区中。该内存在操作期间无法修改。
1.2 静态区
存储静态变量和全局变量
1.3 堆区
堆是一个大容器,它的容量比栈大得多。但在C语言中,堆内存空间的申请和释放需要通过代码手动完成。
1.4 栈区
堆栈不是很大,通常以K 为单位
堆栈溢出:当堆栈空间已满,但变量仍被压入堆栈内存时,这称为堆栈溢出。
函数的所有自动变量和形参均由编译器自动释放并弹出堆栈,放置在堆栈区域中。
对于自动变量,将变量压入或弹出堆栈时不需要程序控制。它可以通过C语言编译器来实现。
对于32位操作系统来说,最大管理内存为4G,其中1G用于操作系统本身,剩余3G用于用户程序。一个用户程序理论上可以使用3G的内存空间。
//模拟堆栈溢出情况
int main()
{
//定义一个很大的数组,会发生栈溢出。
字符数组[1024 * 1024 * 100]={0}; //数组在栈区,占用100M空间
数组[0]="a";
返回0;
}
1.5 malloc和free
malloc 和free 应该成对使用。一块内存不能被释放两次。
#includeint main()
{
//分配内存
int *p=(int *)malloc(sizeof(int) * 10);//在堆中间申请内存,在堆中申请10个int大小的空间
//清除内存
memset(p, 0, sizeof(int) * 10);
//任务
整数我;
for(i=0; i 10; i++)
{
p[i]=i;
}
char *p1=malloc(sizeof(char) * 10); //在堆中申请10个char大小的控件
//释放通过malloc分配的堆内存
免费(p);
免费(p1);
}
//错误,返回栈内存地址,将被释放
int *geta()
{
整数a=10;
返回一个;
}
//合法,可以通过函数的返回值返回一个堆地址,但是一定要记得free
int *geta1()
{
int *p=malloc(sizeof(int));
返回p;
}
//合法,静态区的可以获取,但不能空闲。
int *geta2()
{
静态int a=0;
返回一个;
}会崩溃
函数的形参*p与主函数的*p不同。它们都在堆栈区域中。当前函数是按值传递的。
无效getheap(int *p){
p=malloc(sizeof(int) * 10);
}
int main()
{
int *p=NULL;
获取堆(p);
p[0]=1;
p[1]=2;
免费(p);
返回0;
}
1.6 堆、栈和内存映射
C/C++需要手动释放内存
动态创建数组
整数我;
scanf("%d",i);
int *p=(int *)malloc(sizeof(int) * i);在C语言中,函数的形参是从右到左压入栈的
1.7 calloc和realloc
操作和管理内存的最小单位是页,而不是字节。一般来说,Linux 32位操作系统的内存页为4K。
卡洛克
//#include//#include//#includeint main()
{
//malloc,分配内存后,内容是随机的,需要手动清除。
char *p=malloc(sizeof(char)*10); //分配堆内存,但内容未知
memset(p,0,10); //清除内存
//calloc,分配后的内容已经清为0
char *q=calloc(10,sizeof(char)); //分配堆内存并分配10个字节
//全部都需要免费
免费(p);
自由(q);
}重新分配
int main()
{
//calloc申请内存
char *p1=calloc(10 * sizeof(char));
//realloc,在原有内存的基础上,在堆中间添加连续的内存
//如果原来的内存没有连续的空间可以扩展,那么就会分配一个新的控件,将原来的内存复制到新的控件中,然后释放原来的内存
//realloc与malloc相同。只分配0,不清除0,需要手动清除0。
char *p2=realloc(p1,20); //在p1的基础上重新分配,一共20个
//释放(此时p1和p2的地址相同)
免费(p2);
//
char *ppp=realloc(NULL,5); //相当于malloc(5)
【深入解析C语言内存管理技巧】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
C语言的内存管理真是个头疼事啊。
有11位网友表示赞同!
感觉自己对指针和动态分配还不够熟练。
有19位网友表示赞同!
一直在学如何正确释放内存,避免内存泄漏。
有20位网友表示赞同!
了解C内存管理才能写出更高效的程序。
有6位网友表示赞同!
有时候想想那么多变量占用的内存空间,就觉得有点浪费啊。
有17位网友表示赞同!
学习这玩意儿感觉很有挑战性,但也收获很多.
有13位网友表示赞同!
在面试的时候经常会被问到动态内存分配的问题,真是要加紧了学习才行。
有19位网友表示赞同!
想更好地理解C程序的执行过程,就需要掌握内存管理的知识点。
有9位网友表示赞同!
最近在用C语言做项目,内存管理真是个关卡啊!
有9位网友表示赞同!
真切感受到正确的内存管理是编写高质量C程序的关键所在。
有16位网友表示赞同!
看一些老司机分享的C++ 的内存管理技巧,希望能给自己带来启发。
有19位网友表示赞同!
学习了malloc和free之后,感觉对内存分配有了更直观的理解。
有19位网友表示赞同!
内存泄漏简直是个噩梦,一定要気を付けて!
有6位网友表示赞同!
想要写出高效、安全的C程序,必须得认真对待内存管理。
有13位网友表示赞同!
希望有一天能够轻松应对C内存管理的各种挑战。
有10位网友表示赞同!
感觉掌握了C内存管理之后,自己对编程理解就更深了!
有16位网友表示赞同!
在论坛上看到很多关于C内存管理的问题讨论,大家真是都很关心这方面!
有17位网友表示赞同!
最近也在努力学习C语言的内存管理机制,希望能进步更多。
有15位网友表示赞同!
希望可以找到一些好的学习资源,更深入地学习C语言的内存管理。
有16位网友表示赞同!