动态数组
来源:互联网 发布:手机定位模拟软件 编辑:程序博客网 时间:2024/04/29 07:56
在做上一个acm编程习题的时候其实就考虑过动态数组的问题,只是后来没有用,所以就把它给忘了,不料做到下一个练习的时候,真的还得用到动态数组,在vs2008中是不允许先定义一个变量,然后利用这个变量动态的定义数组的,我们只能使用malloc()内存管理函数。
为什么要使用动态数组呢?在编程的的过程中,往往会出现这样一种情况:事先我们不知道究竟需要多大的内存空间,只有当输入一定的值之后我们才知道究竟需要多大的内存,这时候就需要动态数组。
在使用动态数组中需要注意的一点是:由于使用到了malloc()函数,所以在使用完数组之后需要释放内存,否则造成内存泄露。
动态数组遵循的原则是:
申请的时候从外层想里层,逐层申请,释放的时候从里层向外层,逐层释放。
其实在1001题中已经使用到了动态数组,只不过那里的数组是一个意味的,在acm练习题1002中使用到的数组是二维的。(这部分的内容主要来源于百度百科)】
这里面需要注意的有一下几点:
1、void*并不是代表着函数没有返回值,而是代表着函数的返回值是一个指针,而是返回值是一个节点的地址,该地址的类型是void,表示无类型或者类型是不确定的,即只是知道它返回的是一段存储区的首地址,而它具体的类型是无法确定的,只有在使用的时候根据各个域的具体值来确定。可以根据强制转换的方法将其转换成为别的类型
2、使用sizeof的目的是用来计算一种类型所占的字节数,以适应不同的编译器
3、由于动态分配不一定成功,为此需要附加一段异常处理程序,通常情况下的异常处理程序如下:
if(p==NULL)
{
printf(“动态申请内存失败!\n”);
exit(1);
}
说到这里了,我们顺便说一下exit(0)和exit(1),exit(1)表示的是异常退出,1是返回给操作系统的,exit(0)表示的是正常的退出。一般情况下,0表示的是正常,其他的数字表示的是异常退出,可以自己定义。
4、分配的堆空间是没有名字的,只能通过返回的指针找到它
5、只有动态分配的内存块才能使用free,也不能对同一个内存块free()两次
malloc()和calloc()函数的区别:
对于malloc分配的内存空间,如果原来没有被使用过的话,其中的每一个可能都是0,反之,如果这部分内存空间曾经被分配,释放和重新分配的话,那么其中可能会遗留各种各样的数据,因此在使用malloc函数的时候必须将申请到的函数进行初始化(可以memset),但是使用calloc()函数的时候,在分配的时候已经全部初始化为0了
具体的分配方法如下:
现在以3维整形数组为例:
array{n1][n2][n3]为例
最外层的指针是array,它是个三维指针,所指向的是arry[],其为二维指针。
所以:array=int(***)calloc(n1,sizeof(int**));
次层指针是array[],它是一个二维指针,所指向的是array[][],所指向的是array[][],其为一维指针。所以给array申请内存为:
for(i=1;i<n;i++)
{
array[i]=(int**)calloc(n2,sizeof(int*));
}
最内层的指针是array[][],它是一个一维的指针,指向的是array[][][],其实是一个整形变量,所以给array[][]申请内存应该是:
for(i=0;i<n:i++)
{
for(j=0;j<2;j++)
{
array[i][j]=(int *)calloc(n3,sizeof(int));
}
}
当然也可以把他们放到一起:
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 日记 C++输入输出流 以及创建一个路径的过程(可以是不存在的路径)
- Dotnet内存泄漏
- eclipse中运行安卓程序,提示Failed to allocate memory: 8的解决方法
- windows注册表API使用
- hive的JDBC编码问题解决
- 动态数组
- mysql 随机函数生成某个范围内的整数
- Object-C学习笔记(一):类的定义
- Object-C学习(二):关键字self、super、static的简单理解
- Object-C学习(三):#import与@class的区别
- 【转】关键字static的作用
- Object-C学习(四):使用动态绑定(id类型)
- 快速排序算法
- Object-C学习(五):结构体(struct)、typedef、以及与#define宏定义的区别