C语言——数组与指针之动态分配一维和多维数组

【数组与指针】之【动态分配一维和多维数组】

  • 函数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


参考文献:

  1. http://zhidao.baidu.com/link?url=u0tGehdu72Dh-P5SjAFD2XMJhbel3wsoJbX721XJm-QP3fBFUuiiv7CO7qv6W-GHNydUKkZyaYJpK16N0M7sC_
  2. http://blog.csdn.net/bigloomy/article/details/6615012
  3. http://blog.csdn.net/bigloomy/article/details/6581706

你可能感兴趣的:(C/C++)