C语言——数组与指针之动态分配一维和多维数组
2016-05-11 15:13
561 查看
【数组与指针】之【动态分配一维和多维数组】
函数malloc,calloc,realloc功能介绍
分配动态数组:首先分配一个指针数组,然后把每个指针初始化为动态分配的“列”
删减和扩展动态数组:calloc,realloc
函数原型:
函数声明都在stdlib.h函数库内,或在alloc.h, malloc.h。具体区别有待查询。
malloc调用形式为:指针名P=(数据类型*)malloc(size);在内存的动态存储区中分配一块长度为”size”字节的连续区域,指针的返回值为该区域的首地址,其中包含的元素的个数为size/sizeof(int)。当内存不再使用时,应使用free()函数将内存块释放。
calloc调用形式为:指针名P1=(数据类型*)calloc(N,size);在内存的动态存储区中分配N块长度为”size”字节的连续区域,即参数N和size的乘积就是分配的内存空间的大小。返回首地址,即指针指向改连续区域的首地址。当内存不再使用时,应使用free()函数将内存块释放。
malloc和calloc的另一个区别就是:calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。因此,分别用函数malloc和calloc动态分配能够存储5个int类型数据的空间代码为:
realloc调用形式为:指针名P2=(数据类型*)realloc(P1(要改变内存大小的指针名),N2*old_size);意思是将指针P1指向的区域的大小改变为N2*size这么大的连续区域。N2可比N小,同时也能比N大。即能够通过realloc函数动态的扩展或缩小已经建立的动态数组的大小。具体操作可以参考文献[2]。当内存不再使用时,应使用free()函数将内存块释放。而realloc 不能保证重新分配后的内存空间和原来的内存空间指在同一内存地址, 它返回的指针很可能指向一个新的地址。所以,在代码中,必须把realloc返回的值,重新赋给 p 如:
甚至可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。如:
另外:void *alloca(size_t size)
函数说明:alloca包含在头文件malloc.h中,alloca( )用来配置size个字节的内存空间,然而和malloc/ calloc不同的是, alloca( )是从堆栈空间(stack)中配置内存,因此在函数返回时,即用完时会自动释放此空间。返回值 :若配置成功则返回一指针, 失败则返回NULL
参考文献:
http://zhidao.baidu.com/link?url=u0tGehdu72Dh-P5SjAFD2XMJhbel3wsoJbX721XJm-QP3fBFUuiiv7CO7qv6W-GHNydUKkZyaYJpK16N0M7sC_
http://blog.csdn.net/bigloomy/article/details/6615012
http://blog.csdn.net/bigloomy/article/details/6581706
函数malloc,calloc,realloc功能介绍
分配动态数组:首先分配一个指针数组,然后把每个指针初始化为动态分配的“列”
删减和扩展动态数组:calloc,realloc
函数原型:
void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t nelem, size_t elsize);
函数声明都在stdlib.h函数库内,或在alloc.h, malloc.h。具体区别有待查询。
malloc调用形式为:指针名P=(数据类型*)malloc(size);在内存的动态存储区中分配一块长度为”size”字节的连续区域,指针的返回值为该区域的首地址,其中包含的元素的个数为size/sizeof(int)。当内存不再使用时,应使用free()函数将内存块释放。
calloc调用形式为:指针名P1=(数据类型*)calloc(N,size);在内存的动态存储区中分配N块长度为”size”字节的连续区域,即参数N和size的乘积就是分配的内存空间的大小。返回首地址,即指针指向改连续区域的首地址。当内存不再使用时,应使用free()函数将内存块释放。
malloc和calloc的另一个区别就是:calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。因此,分别用函数malloc和calloc动态分配能够存储5个int类型数据的空间代码为:
int *p=(int *)malloc(20); //20=5乘以sizeof(int) int *p=(int *)calloc(5,sizeof(int));
realloc调用形式为:指针名P2=(数据类型*)realloc(P1(要改变内存大小的指针名),N2*old_size);意思是将指针P1指向的区域的大小改变为N2*size这么大的连续区域。N2可比N小,同时也能比N大。即能够通过realloc函数动态的扩展或缩小已经建立的动态数组的大小。具体操作可以参考文献[2]。当内存不再使用时,应使用free()函数将内存块释放。而realloc 不能保证重新分配后的内存空间和原来的内存空间指在同一内存地址, 它返回的指针很可能指向一个新的地址。所以,在代码中,必须把realloc返回的值,重新赋给 p 如:
p = (int*) realloc (p, old_size + new_size);
甚至可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。如:
int* p = (int*) realloc (0,old_size + new_size); //全新分配一个内存空间,作用完全等同于以下这行: int* p = (int*) malloc(old_size + new_size);
另外:void *alloca(size_t size)
函数说明:alloca包含在头文件malloc.h中,alloca( )用来配置size个字节的内存空间,然而和malloc/ calloc不同的是, alloca( )是从堆栈空间(stack)中配置内存,因此在函数返回时,即用完时会自动释放此空间。返回值 :若配置成功则返回一指针, 失败则返回NULL
参考文献:
http://zhidao.baidu.com/link?url=u0tGehdu72Dh-P5SjAFD2XMJhbel3wsoJbX721XJm-QP3fBFUuiiv7CO7qv6W-GHNydUKkZyaYJpK16N0M7sC_
http://blog.csdn.net/bigloomy/article/details/6615012
http://blog.csdn.net/bigloomy/article/details/6581706
相关文章推荐
- 关于指针的一些事情
- php7 扩展类的写法[2]
- php7 类的方法传参[3]
- php7 读取php.ini[4]
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- C#、ASP.NET通用扩展工具类之TypeParse
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Windows Powershell扩展类型系统
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例