深入解析C语言内存管理技巧

更新:11-22 民间故事 我要投稿 纠错 投诉

大家好,今天给各位分享深入解析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)

用户评论

十言i

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位网友表示赞同!

。婞褔vīp

希望可以找到一些好的学习资源,更深入地学习C语言的内存管理。

    有16位网友表示赞同!

【深入解析C语言内存管理技巧】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:藤子·F·不二雄全集特别版F版购买指南 下一篇:《那年花开月正圆》揭秘人生六层境界,你的位置在哪一层?