用指针动态分配数组
当编写程序时,常常很难为数组估计合适的大小,较为方便的做法是等到程序运行时再来确定数组的是实际大小。其方法是允许程序执行期间为数组分配空间,然后通过只想数组的第一个元素的指针访问数组。常用函数:malloc和realloc
malloc:为数组分配内存空间
realloc:根据需要对数组进行“扩展”或者“缩小”
下面我们来讲具体的实现:
- 使用malloc函数为数组分配存储空间
可以使用malloc函数为数组分配存储空间,我们需要使用sizeof运算符来计算出每个元素所需要的空间数量。假设正在编写的程序需要n个整数构成的数组,这里的n可以再程序执行期间计算出来。
首先声明指针变量:
int a;
一旦n的值已知了,就让程序调用malloc函数维数组分配存储空间:
a = malloc(n * sizeof(int));
一旦a指向动态分配的内存块,就可以忽略a是指针的事实,可以把它用作数组的名字。这都要感谢C语言中数组和指针的紧密关系。例如下列循环可以对a指向的数组进行初始化:
for(i = 0; i < n; i++)
a[i] = i;
同时,用指针算数运算代替取下标操作来访问数组元素也是可行的。
- 使用realloc函数调整数组的大小
一旦为数组分配完合适的内存,稍后可能会发现数组过大或者过小。realloc函数可以调整数组的大小使他更合适需要。下列realloc函数额圆形出现在<stdlib.h>中:
void *realloc(void *ptr, size_t size);
当调用realloc函数时,ptr指针必须指向先前通过malloc或realloc的调用获得的内存块。size表示内存块的新尺寸,新尺寸的可能会大于或小于原有尺寸。虽然realloc函数不要求ptr指向正在用作数组的内存,但实际上通常是这样的。
- free函数
free函数在<stdlib.h>中有下列原型:
void free(void *ptr);
使用free函数很容易,只需要简单的吧指向不再需要内存块的指针传递给free函数就可以了:
p = malloc(...);
q = malloc(...);
free(p);
q = p;
调用free函数会释放p所指向的内存块,然后其内存块可以被后续的malloc函数或其他内存分配函数的调用重新使用。