所有程序都要留有足够的内存来运行。这些内存中有的是自动分配的:
float x; char place [] = "The world!";
为一个基本数据类型的值和一个字符串预留了足够的内存,或者显式指定分配一定数量的内存:
char place[100];
除了这些,还可以动态分配内存:主要工具是malloc()函数,该函数接受一个参数:所需的内存字节数。malloc()函数会找到合适的空闲内存块,这样的内存是匿名的,malloc()分配内存,但没有赋名。函数返回一个动态分配内存块的首地址,可用指针访问这块内存。指针的新类型:void指针,相当于一个通用指针。malloc()函数可返回数组、结构的指针等,把void指针赋值给任意类型的指针完全不用考虑匹配的问题。如果malloc()赋值失败,返回空指针。
使用malloc()函数创建一个数组:
double * ptd; ptd = (double *) malloc(30 * sizeof(double);
以上代码为30个double类型的值请求内存空间,并设置ptd指向该位置。ptd指向的是一个double类型。而不是内含30个double的块。回忆一下,数组名是该数组首元素的地址。如果让ptd指向这个块的首元素,便可像数组名那样使用它。使用表达式ptd[0]访问该块的首元素。ptd[1]第二个元素。。。
现在我们有三种创建数组的方法:
- 声明数组时,用常量表达式表示数组的维度,用数组名访问数组元素。可以用静态、自动内存创建。
- 声明变长数组时,用变量表达式表示数组的维度,用数组名访问元素。只能用自动内存创建。
- 声明一个指针,调用malloc(),将其返回值赋值给指针,使用指针访问数组元素。可以是静态或自动的。
变长数组和malloc()函数可以创建动态数组。可以在程序运行时选择数组的大小和内存分配。例如,n是一个整数变量。在C99之前,不能这样做:
int arr[n];
但是可以这样:
int ptd = (int *)malloc(n * sizeof(int));
通常malloc()函数要与free()配套使用。free()的参数是malloc()函数的返回值。该函数用于释放malloc()分配的内存。因此,动态分配内存的存储期从调用malloc()分配内存到调用free()释放内存为止。设想malloc()和free()管理这同一个地址池,每次malloc()把内存分配给程序使用,free()把内存归还内存池中。不能用free()释放通过其他方式分配的内存。malloc()和free()的函数原型都在stdlib.h中。
使用malloc()分配内存,程序可以在运行时才确定数组大小。如果内存分配失败,可以调用exit()函数结束程序,其原型在stdlib.h。标准定义了两个返回值保证正常运行:EXIT_SUCCESS,表示普通的程序结束;EXIT_FAILURE,表示程序异常终止。例子如下:
#include<stdio.h> #include<stdlib.h> int main(){ double * ptd; int max, number; int i = 0; puts("选择数组长度:"); if(scanf("%d", &max) != 1){ puts("长度设置失败"); exit(EXIT_FAILURE); } ptd = (double *)malloc(max * sizeof(double)); if(ptd == NULL){ puts("数组创建失败"); exit(EXIT_FAILURE); } puts("输入元素:"); while(i < max && scanf("%lf", &ptd[i]) == 1){ ++i; } printf("数组中有%d个元素/n", number = i); for(i = 0; i < number; i++){ printf("%7.2f", ptd[i]); if(i % 7 == 6){ putchar('/n'); } } if(i % 7 != 0){ putchar('/n'); } puts("完成"); free(ptd); return 0; }
calloc()函数
和malloc()类似,返回指向void的指针。如果存储不同的类型,应使用强制类型转换运算符。calloc()接受两个无符号整数作为参数:第一个参数是存储单元个数,第二个参数是存储单元的大小。用calloc()分配的内存默认值为0(malloc()为无意义的值)。free()也可用于释放calloc()分配的内存。
ptd = (double *)calloc(max , sizeof(double)); if(ptd == NULL){ puts("数组创建失败"); exit(EXIT_FAILURE); }
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/278476.html