#include <stdio.h>
#include <stdlib.h> //malloc free
#include <windows.h> //sleep
void main1(){
//int a[1024*1024*1000]; //数组只能处理小数量的数据
int num =100;
//int b[num]; 数组的大小必须明确,num是变量,随时可以变化
//数组内存这种分配机制就称为静态分配,数组使用完成后系统自动回收 //动态内存分配
/* malloc和free是C标准库中提供的两个函数,用以动态申请和释放内存,malloc()函数的基本调用格式为:
void *malloc( unsigned int size );
参数size是个无符号整型数,用户由此控制申请内存的大小,执行成功时,系统会为程序开辟一块大小为size个内存字节的区域,并将该区域的首地址返回,
用户可利用该地址管理并使用该块内存,如果申请失败(比如内存大小不够用),返回空指针NULL。
malloc()函数返回类型是void*,用其返回值对其他类型指针赋值时,必须进行显式转换。
size仅仅是申请字节的大小,并不管申请的内存块中存储的数据类型,因此,申请内存的长度须由程序员通过“长度×sizeof(类型)”的方式给出,举例来说:
int* p=(int*) malloc(5* sizeof(int) );
Free就是释放内存,例如free(p)
*/
//输入一个数字,并用float类型的数据初始化,形式:1.000,2.000 ... f
float f;
scanf("%f",&f);
void *pVoid = malloc(f * sizeof(float)); //malloc返回值是空指针
float *pFloat = (float *)pVoid;
//下标法
for (int i = 0; i < f; ++i) {
pFloat[i] =i+1;
printf("%f,%p \n",pFloat[i],&pFloat[i]);
}
//指针法
printf("\n\n\n");
float *p =pFloat;
int fInt = (int)f;
for ( int i = 0; p < pFloat + fInt; ++i,++p) {
// p < pFloat + fInt此处的条件要注意,既然循环了,就要用p去循环, PFloat是不变的,切忌写成 p < p + fInt,这样的话 < 两边的p就一起动了
*p = i+1;
printf("%f,%p \n",*p,p);
}
free(pVoid); //释放内存 pVoid是地址,只能free一次, NUll指针可以释放多次
}
void main2(){
float f =3.0f;
int a =(int) f;
printf("%d,%f",a,a); //3,0.000000 一个很小的整数,按照%f来解析,会打印出 0.0000000
} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main4(){
int n;
scanf("%d",&n);
//double *pDouble = (double *)malloc(n * sizeof(double)); //malloc不会初始化
double *pDouble = (double *)calloc(n, sizeof(double)); //calloc自动初始化内存为0
for (double i = 0.0; i < n; ++i) {
pDouble[(int)i] =i+1.0; //i 强制转换成int
printf("%lf,%p\n",pDouble[(int)i],&pDouble[(int)i]); }
} void main5(){
int num;
printf("please input the size of array:\n");
scanf("%d",&num);
int *p = (int *)malloc(num * sizeof(int));
if(p==NULL) /*防错处理,看内存申请是否成功*/
{
printf("内存申请失败,退出");
return;
}
for (int i = 0; i < num; ++i) {
p[i] =i+1;
printf("%d,%p\n",p[i],&p[i]);
} printf("if you want to rezize the array, please input a new number:\n");
int newNum;
scanf("%d",&newNum);
//为已经分配的内存重新分配空间并复制内容
// realloc()函数有两个参数:已分配的内存地址,重新分配的字节数
// void *realloc( void *ptr, size_t size )
int *newP = (int *) realloc((void *)p,newNum);
//重新分配newNum字节的内存,并根据p的地址把原来malloc分配的内容复制过来
printf("after realloc, p :%d,%p\n",*p,p); // p :1,00030E58
printf("after realloc, p+5 :%d,%p\n",*(p+5),p+5); // after realloc, p+5 :13643,006D0E6C
//似乎realloc后,没有自动释放掉p,但p的地址不变,只是所指向的类型为空指针 for (int i = num; i < newNum; ++i) { //注意因为前num个元素已经有realloc复制过来了,所以从num开始复制
newP[i] =i+1;
}
//打印新的分配的数组
for (int j = 0; j < newNum; ++j) {
printf("%d,%p\n",newP[j],&newP[j]);
}
free(p); //内存释放以后,指针的值(地址)不会变化,只是把类型取消了
free(newP);
} /*
please input the size of array:
3
1,00020E58
2,00020E5C
3,00020E60
if you want to rezize the array, please input a new number:
6
1,00020E58 可以看到新分配的内存空间首地址是一样的,可以得知旧的p指针所指向的那片内存空间后面任有剩余未占用的空间,所以继续往后分配
2,00020E5C 如果旧指针p后面没有剩余空间了,就会另外找一片内存区域,重新分配,旧的空间就自动释放掉
3,00020E60
4,00020E64
5,00020E68
6,00020E6C*/ void main(){
int num;
printf("please input the size of array:\n");
scanf("%d",&num);
int *p = (int *)malloc(num * sizeof(int));
if(p==NULL) /*防错处理,看内存申请是否成功*/
{
printf("内存申请失败,退出");
return;
} else{
for (int i = 0; i < num; ++i) {
p[i] = i + 1;
printf("%d,%p\n", p[i], &p[i]);
}
printf(" before free :%p\n",p);
free(p); //free 前后p的地址不会发生改变
printf("after free :%p\n",p);
p=NULL; //软件工程规范,释放指针后要置为NULL,可以规避释放后再次引用和反复释放的问题
printf("after free p[2]:%d\n",p[2]); //free之后,再次引用p[2]会出现垃圾数据,会报错 } }

malloc函数动态分配内存的更多相关文章

  1. malloc函数分配内存失败的常见原因

    malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存 ...

  2. 在内存充足时malloc函数分配内存失败的原因及解决

    昨天在修改自己的代码的时候,碰到了malloc函数内存分配失败,上网翻了翻,一个很可能的原因是之前的代码出现了越界操作,导致malloc分配函数所涉及的一些信息被破坏.在这个思想的指导下,今天又是郁闷 ...

  3. 关于malloc函数的动态分配问题

    malloc函数动态分配了一个整型的内存空间,让abc都指向刚申请的空间,所以只有最后一个赋值语句的值保留在了空间里 #include<stdio.h> main() { int *a,* ...

  4. sizeof运算符、malloc函数及free函数

    一.sizeof运算符的用法 1.sizeof运算符给出某个类型或变量在内存中所占据的字节数. int a;  sizeof(a)=4;  //sizeof(int)=4; double b;  si ...

  5. C Primer Plus--C存储类、链接和内存管理之动态分配内存及类型限定词

    目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restr ...

  6. C++ malloc()函数的注意点及使用示例

    1.malloc()函数的头文件是stdlib.h,其函数声明如下: void* malloc(size_t size); 其中参数size_t size表示动态内存分配空间的大小,以字节为单位. s ...

  7. malloc函数

    C语言中,使用malloc函数向内存中动态申请空间. 函数的原型是extern void *malloc(unsigned int num_bytes); 可见,函数返回的是指针类型,参数是要申请的空 ...

  8. 使用malloc和free函数进行内存动态分配

    一.在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来 ...

  9. C语言malloc()函数:动态分配内存空间

    头文件:#include <stdlib.h> malloc() 函数用来动态地分配内存空间(如果你不了解动态内存分配,请查看:C语言动态内存分配及变量存储类别),其原型为:void* m ...

随机推荐

  1. opencv —— boundingRect、minAreaRect 寻找包裹轮廓的最小正矩形、最小斜矩形

    寻找包裹轮廓的最小正矩形:boundingRect 函数 返回矩阵应满足:① 轮廓上的点均在矩阵空间内.② 矩阵是正矩阵(矩形的边界与图像边界平行). Rect boundingRect(InputA ...

  2. java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

  3. 使用Sqlserver 2012 导出表数据为SQL脚本

    目录 前言 具体步骤 前言 很多时候,我们需要把数控库中的表的数据导出成SQL脚本的情形.然后,在别的库执行的情况. 以下,总结使用Sqlserver 2012数据库中表数据导出成SQL脚本的步骤. ...

  4. 【学习笔记】B站-2019-NLP(自然语言处理)之 BERT 课程 -- 相关课程笔记

    BERT 课程笔记 1. 传统方案遇到的问题 BERT的核心在于Transformer,Transformer就类似seq2seq网络输入输出之间的网络结构. 传统的RNN网络:最大的问题,因为不能并 ...

  5. thinkPHP5.1模型User设计

    创建一个User类,再引入think\Model,让User类继承Model 例: <?php namespace app\index\model; use think\Model; class ...

  6. day9 修改文件

    # 修改文件 # 文件是不能修改 with open('小护士班主任', mode='r', encoding='utf-') as f, open('小护士班主任.bak', 'w', encodi ...

  7. ural 2124

    题意 ural 做法 求出一个原根\(\omega\),对于每个数\(x\)写成\(x=\omega^{k}\)的形式,\(\delta(x)=\frac{p-1}{k}\) 我们不关心群具体的东西, ...

  8. 免费免驱动从网上截取正版音乐与MV及视频

    在QQ Music里听到Alan Walker 的 Songs,想download,但是要绿钻.MV也有QQ音乐的logo,这下有了一个绝佳的办法! Tools:1.Gihosoft TubeGet  ...

  9. MySQL 8 服务端帮助支持

    MySQL 服务器支持 HELP 语句,该语句返回参考手册中相应信息,比如: mysql> help change master to; 返回创建主从复制相关语句的信息 参考手册的信息存储在my ...

  10. Android9.0 Camera2 横屏问题修改记录

    vendor\mediatek\proprietary\packages\apps 目录下有三份相机源码 分别是 Camera. Camera1. Camera2 通过查看 mk 发现通过 ifeq ...