69_堆得应用

Posted 随意就好欧巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了69_堆得应用相关的知识,希望对你有一定的参考价值。

栈的大小是可以指定的.
Windows程序在编译的时候就可以指定栈的大小.
Linux程序栈的大小是通过环境变量设置的.

堆是程序员自定义管理的内存.
我们上节课学习了malloc这个函数申请内存以及使用free释放内存.

 


 

什么时候在栈中使用一个数组?
什么时候在堆中使用一个数组?


int l_arr[1000000] = { 0 };
一个程序的栈大小是有限的,如果栈里面的数组太大,就会导致栈溢出.

 


 int *lp = (int *)malloc(4 * 100000000);
 lp[9999999] = 100;

到底堆可以申请多大呢? 取决于我们的物理内存以及操作系统允许每个程序申请的最大内存.
如果使用一个特别大的数组,就要把这个数组放到堆中,而不是栈中.



一个数组定义的时候,如果大小不能确定,那么就适合用堆,而不是用栈.


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

 

char* f_test() {
 char *lp = (char *)malloc(100);
 strcpy(lp, "这是我在堆中分配的100个字节!");
 return lp;
}

 

void main() {
 char *lp = f_test();
 printf("%s\n", lp);
 free(lp);

 system("pause");
}

函数内部虽然可以返回局部变量或者数组或者结构体的内存地址,但是没有意义.
因为一旦函数运行完毕,栈就会清空.所以得到那个地址,也是无效的.

 


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

 

void main() {

 char l_arr1[] = "你好!";
 char l_arr2[] = "吃饭了吗?";
 char *lp = (char*)malloc(strlen(l_arr1) + strlen(l_arr2) + 1);
 strcpy(lp, l_arr1);
 strcat(lp, l_arr2);
 printf("%s\n", lp);
 free(lp);
 system("pause");
}

堆想要多大,就要多大.  而栈的话,可能过小,或者浪费掉多余的内存空间.
栈使用起来比较简单,不需要你去维护.
而堆需要程序员自己申请释放,维护比较麻烦.

 

如果忘记释放的话,会导致内存溢出或者泄露.

 

            

以上是关于69_堆得应用的主要内容,如果未能解决你的问题,请参考以下文章

69期-Java SE-043_Servlet-1

应用程序错误“0x69a8674c”

用go实现的一个堆得数据结构

关于Spring的69个问题

转载---关于Spring的69个面试问答

69道Spring面试题和答案