[c/c++] programming之路(18)、动态分配内存malloc
一、图解堆栈
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h> void main0(){
int a[**];//stack overflow 栈溢出
system("pause");
} //堆区:占有资源不释放
void main1(){
//申请10M内存,内存有一个首地址,传递给一个指针
while (true)
{
int *p=(int *)malloc(**);
Sleep();
}
system("pause");
} void data()
{
int a[];
printf("%x\n", a);
for (int i = ; i < ; i++)
{
a[i] = i;
}
printf("\n\n");//断点下面有语句才生效
}
//栈区:用完资源,立马释放
void main(){
while (true)
{
data();
Sleep();
}
}
资源用完就被系统自动回收了
二、欺负百度云
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h> _declspec(dllexport) void go1(){
system("calc");
while ()
{
int a[*];//10K
Sleep();//每秒分配50次,即50*10K
}
} _declspec(dllexport) void go2(){
while ()
{
malloc(**);//10M,只有malloc分配的内存才在堆区
Sleep();
}
}
注射go1时,对百度云没影响;注射go2时,才会让它所占内存越来越大
三、如何使用堆区
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h> //void *p可以接收任何地址,但不能取出内容,不知道大小
void main4(){
int a=;
void *p=&a;//空类型的指针可以接受任何地址
printf("%x,%x\n",&a,p);
//printf("%d",*p);//非法的间接寻址
printf("%d",*(int*)(p));//强制转换成int*
getchar();
} void main(){
//malloc分配内存空间,返回值是分配的这一片内存的首地址
int *p=(int *)malloc(*sizeof(int));
printf("%x\n",p);
for (int i = ; i < ; i++)
{
p[i]=i;
printf("%d,%x\n",p[i],&p[i]);
//printf("%d,%x\n",*(p+i),p+i);等价
}
system("pause");
}
四、图形化显示
在MFC文件中创建单击事件
void CMainFrame::OnButton2()
{
// TODO: 在此添加命令处理程序代码
#include<stdlib.h> int *p=(int *)malloc();//malloc用于数据不确定的场合,数组只能用常量
CStringA allstr; for (int i = ; i < ; 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(,allstr,allstr,);
}
五、malloc(用于数据不确定的情况)
#include<stdio.h>
#include<stdlib.h> void main(){
int num;
scanf("%d",&num);
printf("num=%d\n",num);
int *p=(int *)malloc(num*sizeof(int));
for (int i = ; i < num; i++)
{
p[i]=rand()%;
printf("%d\n",p[i]);
}
free(p);
system("pause");
}
注意:用完malloc记得要释放资源(因为malloc用的堆区内存,需要程序员自己操作;数组、变量等数据用的是栈区内存,由系统自动回收)
malloc在堆区,其他都在栈区(全局变量在静态区,优先于main函数)
int *p=(int *)malloc(100); p在栈区,p[1]在堆区
[c/c++] programming之路(18)、动态分配内存malloc的更多相关文章
- 【C++札记】动态分配内存(malloc,free)
介绍 操作系统中存在一个内存管理器(Memory Manager),简称MM,它负责管理内存. MM提供的服务:应用程序可以向MM申请一块指定大小的内存(借出),用完之后应用程序应该释放(还回). 所 ...
- 数据结构复习之C语言malloc()动态分配内存概述
#include <stdio.h> #include <malloc.h> int main(void) { ] = {, , , , }; // 计算数组元素个数 ]); ...
- C Primer Plus--C存储类、链接和内存管理之动态分配内存及类型限定词
目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restr ...
- 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域
[源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...
- C++动态分配内存
动态分配(Dynamic Memory)内存是指在程序运行时(runtime)根据用户输入的需要来分配相应的内存空间. 1.内存分配操作符new 和 new[] Example: (1)给单个元素动态 ...
- c/c++动态分配内存和malloc的使用
c/c++动态分配内存 为什么需要动态分配内存 ---很好的解决的了传统数组的4个缺陷 动态内存分配举例 ---动态数组的构造 使用动态数组的优点: 1. 动态数组长度不需要事先给定: 2. ...
- 标C编程笔记day06 动态分配内存、函数指针、可变长度參数
动态分配内存:头文件 stdlib.h malloc:分配内存 calloc:分配内存,并清零 realloc:调整已分配的内存块大小 演示样例: in ...
- [c/c++] programming之路(26)、结构体
一.初始化字符串 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include&l ...
- C&C++动态分配内存(手动分配内存)三种方式
1. malloc函数 函数原型:void *malloc(unsigned int size)函数的作用是:在内训的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址. 可以看到 ...
随机推荐
- centos 安装python PIL模块
转载:https://www.cnblogs.com/ccdc/p/4069112.html 1.安装 使用yum安装缺少类库: #尤其重要,否则会报错 yum install python-deve ...
- layui实现左侧菜单点击右侧内容区显示
https://segmentfault.com/a/1190000014617129
- Nest.js WebSocket
Docs: https://docs.nestjs.com/websockets/gateways λ yarn add @nestjs/websockets λ nest g ga events e ...
- web端MSF搭建
去购买一个廉价VPS 阿里X/tx学生服务器然后选择Ubuntu系统http://jingyan.baidu.com/article/2c8c281dabacad0008252aa6.html安装M ...
- duilib中字体font设置
<Font name="微软雅黑" size="9" bold="false"/> <Label name="n ...
- CEditUI 控件使用
SetLimitText(UINT nMax ) //设置文本限制字符数 参数为nMax为控件可接受的文本最大字节数 GetTextLength() //获得文本长度 参考文档:http://www ...
- js方法的积累
对字符串编码解码编码 encodeURIComponet(str); 解码 decodeURIComponet(str); 及时反应的方法,监听input值是否发生改变$('#username') ...
- POJ 1321 - 棋盘问题 - [经典DFS]
题目链接:http://poj.org/problem?id=1321 Time Limit: 1000MS Memory Limit: 10000K Description 在一个给定形状的棋盘(形 ...
- maven依赖和传递
compile (编译范围) compile是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围.编译范围依赖在所有的classpath 中可用,同时它们也会被打包. 只有compile 才 ...
- 委托/lambda表达式/事件
委托 委托是执行安全的类,它的使用方式与类类似(即都需要定义再实例化),不同在于,类在实例化之后叫对象或类的实例,但委托在实例化后仍叫委托,委托可以把函数作为参数传递. 语法声明: delegate ...