[c/c++] programming之路(18)、动态分配内存malloc   一、图解堆栈 二、欺负百度云  三、如何使用堆区 四、图形化显示 五、malloc(用于数据不确定的情况)

一、图解堆栈

[c/c++] programming之路(18)、动态分配内存malloc
 
一、图解堆栈
二、欺负百度云
 三、如何使用堆区
四、图形化显示
五、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 }

[c/c++] programming之路(18)、动态分配内存malloc
 
一、图解堆栈
二、欺负百度云
 三、如何使用堆区
四、图形化显示
五、malloc(用于数据不确定的情况)  [c/c++] programming之路(18)、动态分配内存malloc
 
一、图解堆栈
二、欺负百度云
 三、如何使用堆区
四、图形化显示
五、malloc(用于数据不确定的情况)

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

二、欺负百度云

 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 }

[c/c++] programming之路(18)、动态分配内存malloc
 
一、图解堆栈
二、欺负百度云
 三、如何使用堆区
四、图形化显示
五、malloc(用于数据不确定的情况)

四、图形化显示

 在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);
}

[c/c++] programming之路(18)、动态分配内存malloc
 
一、图解堆栈
二、欺负百度云
 三、如何使用堆区
四、图形化显示
五、malloc(用于数据不确定的情况)

五、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 }

[c/c++] programming之路(18)、动态分配内存malloc
 
一、图解堆栈
二、欺负百度云
 三、如何使用堆区
四、图形化显示
五、malloc(用于数据不确定的情况)

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

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

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