博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[c/c++] programming之路(18)、动态分配内存malloc
阅读量:4312 次
发布时间:2019-06-06

本文共 2735 字,大约阅读时间需要 9 分钟。

 

一、图解堆栈

1 #include
2 #include
3 #include
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
2 #include
3 #include
4 5 _declspec(dllexport) void go1(){ 6 system("calc"); 7 while (1) 8 { 9 int a[1024*10];//10K10 Sleep(20);//每秒分配50次,即50*10K11 }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
2 #include
3 #include
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
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
2 #include
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]在堆区

转载于:https://www.cnblogs.com/little-monkey/p/7422575.html

你可能感兴趣的文章
python代码迷之错误(ModuleNotFoundError: No module named 'caffe.proto')
查看>>
nodejs adm-zip 解压文件 中文文件名乱码 问题解决
查看>>
MapReduce-文本输入
查看>>
在Linux中简单实现回收子进程
查看>>
<Bootstrap> 学习笔记六. 栅格系统使用案例
查看>>
学习blus老师js(6)--js运动基础
查看>>
谈谈架构非功能性
查看>>
【timeisprecious】【JavaScript 】JavaScript RegExp 对象
查看>>
How to set colors of HTML tables
查看>>
Cannot parse POST parameters of request: '<URL>'
查看>>
Hibernate 关联映射
查看>>
PHP语法2
查看>>
python unittest学习1---重要的几个概念
查看>>
MapReduce编程之Reduce Join多种应用场景与使用
查看>>
干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)
查看>>
使用pyinstaller打包多个py文件为一个EXE文件
查看>>
书接前文,用多进程模式实现fibonnachi并发计算
查看>>
numpy的数组常用运算练习
查看>>
ExtJs之DHTML,DOM,EXTJS的事件绑定区别
查看>>
Leetcode:Toeplitz Matrix
查看>>