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()函数可以创建动态数组。可以在程序运行时选择数组的大小和内存分配。例如,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; }
和malloc()类似,返回指向void的指针。如果存储不同的类型,应使用强制类型转换运算符。calloc()接受两个无符号整数作为参数:第一个参数是存储单元个数,第二个参数是存储单元的大小。用calloc()分配的内存默认值为0(malloc()为无意义的值)。free()也可用于释放calloc()分配的内存。
ptd = (double *)calloc(max , sizeof(double)); if(ptd == NULL){ puts("数组创建失败"); exit(EXIT_FAILURE); }