[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个字节的连续空间,返回所分配区域的首字节地址. 可以看到 ...
随机推荐
- SQL 四大功能DDL/DML/DCL/TCL
SQL主要分成四部分:(1)数据定义.(SQL DDL)用于定义SQL模式.基本表.视图和索引的创建和撤消操作.(2)数据操纵.(SQL DML)数据操纵分成数据查询和数据更新两类.数据更新又分成插入 ...
- Python __all__变量用法
Python中一个py文件就是一个模块,“__all__”变量是一个特殊的变量,可以在py文件中,也可以在包的__init__.py中出现. 1.在普通模块中使用时,表示一个模块中允许哪些属性可以被导 ...
- python中的张量运算(tensor)
1,首先比较二者的参数部分:这就是处理0阶张量和1阶张量的区别 np.max:(a, axis=None, out=None, keepdims=False) 求序列的最值 最少接收一个参数 axis ...
- flask将日志写入日志文件
import logging logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别 filename='log_new.log', # 将日志写入lo ...
- 设置弹窗、遮罩的样式设置(包括:left、heigh等)
.zhezhao { width:100%; background-color:#000; filter:alpha(opacity=50); -moz-opacity:0.5; opacity:0. ...
- mysql limit 性能问题分析
问题重现 // todo 参考文章: MySQL 单表分页 Limit 性能优化 Scalable MySQL: Avoid offset for large tables 证明为什么用limit时, ...
- Python学习之旅(十三)
Python基础知识(12):函数(Ⅲ) 高阶函数 1.map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterat ...
- myEclipse导入现成项目出现错误 【申明来源于网络】
myEclipse导入现成项目出现错误 [申明来源于网络] 原地址:http://blog.sina.com.cn/s/blog_6d7703400100znh6.html file–>impo ...
- 洛谷P3384 【模板】树链剖分
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- 通过ICE轻松部署WES7镜像
作者:雷志刚 转自:http://lzg-ad.blog.sohu.com/156323256.html 注:该文转自Happymy,感谢他的技术提供和分享. 本文适合的软件版本:CTP,RC 如果大 ...