使用malloc()创建动态数组
因本人才疏学浅,见识浅薄,有不当之处望指正,谢谢!
当我们创建数组时,不允许在程序运行时选择数组的大小和分配内存。如果n是一个整形变量。
double a[n]; // C99以前不允许,n是变量
但是,可以
a = (double *) malloc(n * sizeof(double)); // 允许
关于内存分配。所有程序都必须预留足够多内存储存程序使用的数据。这些内存有的是自动分配。比如,下面声明:
float a;
char words[] = "Let's study the C language!";
为一个float类型的值和一个字符串预留了足够的内存,或者可以显式指定分配一定数量的内存;
int number[100];
该声明预留了100个内存位置,每个位置都用于储存int类型的值。
静态数据在程序载入内存时分配,而自动数据在程序执行块时分配,并在程序离开该块时释放。
C语言可以做更多,可以在程序运行时分配更多的内存。主要是malloc()函数,
malloc()函数原型:
extern void *malloc
该函数接受一个参数:所需的内存字节数。malloc()函数会找到合适的空闲内存块,这样的内存是匿名的。就是说,malloc()分配内存,不会为其赋名。但是,它确实返回动态分配内存块的首字节地址。可以把该地址赋给指针变量,并使用指针访问这块内存。
我们用malloc()创建一个数组。除了用malloc()在程序运行时请求一块内存,还需要一个指针记录这块内存的位置。比如:
double * a;
a = (double *) malloc(30 * sizeof(double));
应该坚持使用强制类型转换,提高代码的可读性。
以上代码为30个double类型的值请求内存空间,并设置a指向该位置。指针a指向一个double类型,不是指向内含30个double类型值的块。
malloc()和free()配套使用
free()将内存归还内存池
malloc()和free()的原型都在stdlib.h头文件中
使用malloc(),程序可以在运行时才确定数组大小。如下:
// dyn_arr -- 动态分配数组
#include <stdio.h>
#include <stdlib.h> // 为malloc(), free()提供原型
int main(void)
{
double * a;
int max;
int number;
int i = 0;
printf("What is the maximum number of type double entries?\n");
if(scanf("%d", &max) != 1)
{
printf("Number not correctly entered -- bye.\n");
exit(EXIT_FAILURE);
}
a = (double *) malloc(max * sizeof(double));
if(a == NULL)
{
printf("Memory allocation failed. Goodbye.\n");
exit(EXIT_FAILURE);
}
// a 现在指向有max个元素的数组
printf("Enter the values (q to quit):\n");
while(i < max && scanf("%lf", &a[i]) == 1)
++i;
printf("Here are your %d entries:\n", number = i);
for(i = 0; i < number; i++)
{
printf("%7.2f ", a[i]);
if(i % 7 == 6)
printf("\n");
}
if(i % 7 != 0)
printf("\n");
printf("Done.\n");
free(a);
return 0;
}
如图:
输入6个数:
虽然输入6个数,但是程序也只处理前5个数