[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\n", a);
26     for (int i = 0; i < 10; i++)
27     {
28         a[i] = i;
29     }
30     printf("\n\n");//断点下面有语句才生效
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\n",&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\n",p);
19     for (int i = 0; i < 20; i++)
20     {
21         p[i]=i;
22         printf("%d,%x\n",p[i],&p[i]);
23         //printf("%d,%x\n",*(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\r\n",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\n",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\n",p[i]);
13     }
14     free(p);
15     system("pause");
16 }

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

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

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

posted @ 2017-08-24 15:23  进击的小猴子  阅读(359)  评论(0编辑  收藏  举报