c语言 动态数组
C语言中,在声明数组时,必须明确告诉编译器数组的大小,之后编译器就会在内存中为该数组开辟固定大小的内存。有些时候,用户并不确定需要多大的内存,使用多大的数组,为了保险起见,有的用户采用定义一个大数组的方法,开辟的数组大小可能比实际所需大几倍甚至十几倍,这造成了内存的浪费,带来了极大的不便。另一方面,即使用户确切知道要存放的元素个数,但随着问题的深入,元素数目可能会变化,变少还好处理,可如果数目增加呢,用什么来存储的,类似于数组内存这种分配机制就称为静态分配,很明显,静态分配是由编译器完成的,在程序执行前便已指定。显而易见,静态分配虽然直观,易理解,但存在明显的缺陷,不是容易浪费内存就是内存不够用,为解决这一问题,C语言引入了动态分配机制。
C语言函数库中提供了malloc和free函数,允许用户用户调用以动态申请说需要的内存,给程序的设计带来了很大的灵活性。(引用尹成的ppt)
现在我们来创建一个动态大小的数组
#include<stdio.h>
#include<stdlib.h> //内存释放完成以后必须释放
//分配动态数组 void main(){
int num = ;
int *p = malloc(num * sizeof(int));
printf("%x", p);//打印内存地址
for (int i = ; i < num; i++)
{
printf("\n%d", p[i] = i + );
}
//内存释放完成以后必须释放
free(p);
system("pause");
}
#include<stdio.h>
#include<stdlib.h> //内存释放完成以后必须释放
//分配动态数组 void main(){
//calloc需要两个参数以指定申请内存块的大小,第一个参数一种数据结构的个数,第二个参数是单个数据结构的大小。
//注意:malloc一般不会初始化系统分配的内存块,通常需要使用memset()函数来初始化,而calloc()函数会初始化系统分配的内存块,将所有的位(bit)置零。
//calloc一般使用后要使用 free(起始地址的指针) 对内存进行释放,不然内存申请过多会影响计算机的性能,
//以至于得重启电脑。如果使用过后不清零,还可以使用指针对该块内存进行访问。
int *p = (int *)calloc(50,sizeof(int));//动态分配 for (int i = ; i < ; i++)
{
printf("\n%d", p[i] = i + );
}
printf("\n%x", p);
printf("*******************************\n");
//realloc将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域
//(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。
//realloc会把释放的内存拷贝到新地址,
//新的大小可大可小(但是要注意,如果新的大小小于原内存大小,可能会导致数据丢失,慎用!)
int *p1 = realloc(p, sizeof(int)* );
printf("\n%x", p1);
printf("*******************************\n");
for (int i = ; i < ; i++)
{
printf("\n%d", p1[i]);
} //当内存不再使用时,应使用free()函数将内存块释放。 free(p1);
//通过最终结果观察可知,通过realloc函数在calloc函数的内存上所新分配的内存其实首地址是一样的,
//即p的值和p1的值是一样的
//好像内存机制并不是复制calloc函数的内存,而是在calloc函数的内存的基础上又申请了一段 system("pause"); }

c语言 动态数组的更多相关文章
- 线性表之顺序存储结构(C语言动态数组实现)
线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...
- C语言 动态数组实现
一.概述 C语言是不能直接定义动态数组的,数组必须在初始化时确定长度. 如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组. 二.动态内存分配函 ...
- [UE4]C 语言动态数组
在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定.对于这种问题,用静态数组的办法很难解决.为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指 ...
- C语言 · 动态数组的使用
从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...
- (2)redis的基本数据结构是动态数组
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; ]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针, ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- c语言,动态数组
试着直接malloc一个2*3*4的空间来模拟数组: #include <stdio.h> #include <malloc.h> int main(void) { int** ...
- C语言基础 - 实现动态数组并增加内存管理
用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...
- [C] 在 C 语言编程中实现动态数组对象
对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...
随机推荐
- 记录Hibernate的缓存知识
一.Hibernate缓存的作用 Hibernate是一个持久层框架,Hibernate要经常访问物理数据库.为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能,Hibernate的缓 ...
- 《笨办法学python第三版》习题26,原错误代码及正确代码
#import ex25 1 def break_words(stuff): """This function will break up words for us.&q ...
- 测试管理_出色测试管理者的思考[持续更新ing]
如何合理安排并按质按量按时完成每一个测试任务,做好项目管理? 如何把控到每一个测试任务的质量? 如何快速构建和构建好测试环境? 如何获取或快速制作测试数据? 如何确保每一个测试人员的工作都饱满? 如何 ...
- JavaScript Patterns 3.8 Error Objects
The error objects created by constructors(Error(), SyntaxError(), TypeError(), and others) have the ...
- 颠覆式前端UI开发框架:React
转自:http://www.infoq.com/cn/articles/subversion-front-end-ui-development-framework-react/ 基于HTML的前端界面 ...
- 深入PHP内核之ZVAL
一.PHP的变量类型 PHP的变量类型有8种: 标准类型:布尔boolen,整型integer,浮点float,字符string 复杂类型:数组array,对象object 特殊类型:资源resour ...
- 使用Number.parseFloat引发的悲剧
起因: 前几天,项目中有人用了Number.parseFloat(xxx)方法.在Chrome和FF中是可以使用的.然而在IE中却报错,提示不存在这个function. Solution: 经查Jav ...
- 闭包Closures
所谓闭包,可以理解为一个可以用于函数,参数,返回值处的代码块 import Foundation func isGood(a:Int,b:Int)->Bool{ return a>b; } ...
- Android中的Shape使用总结
参考:http://www.cnblogs.com/gzggyy/archive/2013/05/17/3083218.html 在Android程序开发中,我们经常会去用到Shape这个东西去定义各 ...
- Azure CDN 启用HTTPS
默认情况下,订阅里的CDN不支持HTTPS 需要联系21v,提交工单告知订阅号,由后台为订阅启用CDN的HTTPS功能. 然后就可以在创建CDN时选到HTTPS的选项了.