zoukankan      html  css  js  c++  java
  • [c/c++] programming之路(18)、动态分配内存malloc

     

    一、图解堆栈

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<Windows.h>
     4 
     5 void main0(){
     6     int a[1024*1024*10];//stack overflow 栈溢出
     7     system("pause");
     8 }
     9 
    10 //堆区:占有资源不释放
    11 void main1(){
    12     //申请10M内存,内存有一个首地址,传递给一个指针
    13     while (true)
    14     {
    15         int *p=(int *)malloc(1024*1024*10);
    16         Sleep(2000);
    17     }
    18     system("pause");
    19 }
    20 
    21 
    22 void data()
    23 {
    24     int a[10];
    25     printf("%x
    ", a);
    26     for (int i = 0; i < 10; i++)
    27     {
    28         a[i] = i;
    29     }
    30     printf("
    
    ");//断点下面有语句才生效
    31 }
    32 //栈区:用完资源,立马释放
    33 void main(){
    34     while (true)
    35     {
    36         data();
    37         Sleep(5000);
    38     }
    39 }

      

    资源用完就被系统自动回收了 

    二、欺负百度云

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<Windows.h>
     4 
     5 _declspec(dllexport) void go1(){
     6     system("calc");
     7     while (1)
     8     {
     9         int a[1024*10];//10K
    10         Sleep(20);//每秒分配50次,即50*10K
    11     }
    12 }
    13 
    14 _declspec(dllexport) void go2(){
    15     while (1)
    16     {
    17         malloc(1024*1024*10);//10M,只有malloc分配的内存才在堆区
    18         Sleep(2000);
    19     }
    20 }

    注射go1时,对百度云没影响;注射go2时,才会让它所占内存越来越大

     三、如何使用堆区

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<Windows.h>
     4 
     5 //void *p可以接收任何地址,但不能取出内容,不知道大小
     6 void main4(){
     7     int a=10;
     8     void *p=&a;//空类型的指针可以接受任何地址
     9     printf("%x,%x
    ",&a,p);
    10     //printf("%d",*p);//非法的间接寻址
    11     printf("%d",*(int*)(p));//强制转换成int*
    12     getchar();
    13 }
    14 
    15 void main(){
    16     //malloc分配内存空间,返回值是分配的这一片内存的首地址
    17     int *p=(int *)malloc(20*sizeof(int));
    18     printf("%x
    ",p);
    19     for (int i = 0; i < 20; i++)
    20     {
    21         p[i]=i;
    22         printf("%d,%x
    ",p[i],&p[i]);
    23         //printf("%d,%x
    ",*(p+i),p+i);等价
    24     }
    25     system("pause");
    26 }

    四、图形化显示

     在MFC文件中创建单击事件

    void CMainFrame::OnButton2()
    {
        // TODO: 在此添加命令处理程序代码
        #include<stdlib.h>
    
        int *p=(int *)malloc(40);//malloc用于数据不确定的场合,数组只能用常量
        CStringA allstr;
    
        for (int i = 0; i < 10; i++)
        {
            p[i]=rand();//随机数
            CStringA str;
            str.Format("p[%d]=%d,&p[%d]=%x
    ",i,p[i],i,&p[i]);
            allstr+=str;
        }
        MessageBoxA(0,allstr,allstr,0);
    }

    五、malloc(用于数据不确定的情况)

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 void main(){
     5     int num;
     6     scanf("%d",&num);
     7     printf("num=%d
    ",num);
     8     int *p=(int *)malloc(num*sizeof(int));
     9     for (int i = 0; i < num; i++)
    10     {
    11         p[i]=rand()%300;
    12         printf("%d
    ",p[i]);
    13     }
    14     free(p);
    15     system("pause");
    16 }

    注意:用完malloc记得要释放资源(因为malloc用的堆区内存,需要程序员自己操作;数组、变量等数据用的是栈区内存,由系统自动回收)

     malloc在堆区,其他都在栈区(全局变量在静态区,优先于main函数)

    int *p=(int *)malloc(100);    p在栈区,p[1]在堆区

  • 相关阅读:
    2008年具有高校自主选拔录取资格的考生名单 江苏版
    OpenGL ES 2.0 for iPhone Tutorial
    Mathematica三维点插值算法(高维插值,多维插值)
    Mathematica颜色系,你喜欢哪一个?
    Khronos EGL and Apple EAGL
    ssh 免密码登陆配置
    2008年高考招生:北京大学自主选拔录取资格考生名单
    PlotLegends 应用
    Mathematica 如何更改文档的样式
    您为何而工作?
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7422575.html
Copyright © 2011-2022 走看看