zoukankan      html  css  js  c++  java
  • 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 ", 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 ", lp);
     free(lp);
     system("pause");
    }

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

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

                

  • 相关阅读:
    【转】Windows Socket网络编程(二)套接字编程原理
    获取本地IP地址,并在IP CONTROL控件中显示出来
    PAT 1021 Deepest Root[并查集、dfs][难]
    1025 PAT Ranking[排序][一般]
    PAT 1028 List Sorting[排序][一般]
    PAT 1023 Have Fun with Numbers[大数乘法][一般]
    PAT 1026 Table Tennis[比较难]
    Andrew NgML第十章应用机器学习的建议
    PAT 1020 Tree Traversals[二叉树遍历]
    PAT 1022 Digital Library[map使用]
  • 原文地址:https://www.cnblogs.com/xiaodaxiaonao/p/8047504.html
Copyright © 2011-2022 走看看