一、图解堆栈
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]在堆区