[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个字节的连续空间,返回所分配区域的首字节地址. 可以看到 ...
随机推荐
- JIRA应用的内存参数设置不当+容器没有对资源进行限制导致服务挂掉的例子
背景: 应用的部署结构是这样的:使用rancher管理的Docker集群,有三台物理主机,二十多个Docker容器, 提供的功能是问题跟踪(JIRA),文档管理(Confluence),代码托管(sv ...
- 关于vmware 11.1安装windows 7操作系统时报错 Unist specified don’t exist. SHSUCDX can’t install
笔者今天在vmware 11.1 虚拟机下使用光驱安装windows 7 32位操作系统时,报错: Unist specified don’t exist. SHSUCDX can’t install ...
- 第五天 py if使用
if 的结果缩进 用个Tab 缩进四个空格就好了
- 3D Slicer Reconstruct CT/MRI
3D Slicer Reconstruct CT/MRI 1. Load DCM file of your CT/MRI 2. Go to Volume Rendering, click the ey ...
- poj1696
没看题解,搜了一下都是什么叉积凸包,根本没有必要用吧.. 显然这个题我们找夹角就可以了,根据高中的公式 a·b=|a|*|b|*cos<a,b> 所以用点积找一个 cos<a,b&g ...
- PHP中通过bypass disable functions执行系统命令的几种方式
原文:http://www.freebuf.com/articles/web/169156.html 一.为什么要bypass disable functions 为了安全起见,很多运维人员会禁用PH ...
- try 和 catch 和 finally
try块中出现异常走进catch,异常后面的代码不会再被执行:finally块里try和catch执行完后要执行的代码,且一定会执行. 在释放资源的时候,不要多个放在一个try块里面. 流的关闭顺序: ...
- centos7忘记root密码重置
1.重启服务器,选择内存按“e”编辑 2.找到下入内容 3.将上图中标记的ro改为rw init=/sysroot/bin/sh 4.按Ctrl+x进入单用户模式 5.执行命令chroot /sysr ...
- Python递归函数介绍
一.递归的定义 1.什么是递归:在一个函数里在调用这个函数本身 2.最大递归层数做了一个限制:997,但是也可以自己限制 # 验证 997 def foo(n): print(n) n+=1 foo( ...
- Interllij IDEA中启动web项目
1.在IDEA中打开你的Web应用,点击一下绿色三角形左边的框框,然后在弹出框上选择Edit Configurations,会弹出一个配置面板. 2.在弹出的面板中我们点击Defaults,然后找到T ...