11 动态内存分配

在编写程序的时候,可能不知道一个数组需要开多大的空间,只有运行的时候才能知道。这种情况就需要使用动态内存分配。

11.1 malloc和free

void *malloc(size_t size);
void free(void *pointer);

malloc的参数就是需要分配的字节数,分配的是一块连续的内存。malloc不会对分配的内存进行初始化。如果分配失败,则返回NULL。

free的参数必须是NULL,或者是malloc,calloc或realloc返回的值。一次动态分配的内存必须一起释放。如果要改变分配的内存的大小,用realloc。

11.2 calloc和realloc

void *calloc(size_t num_elements, size_t element_size);
void realloc(void *ptr, size_t new_size);

calloc除了参数与malloc不同之外,还会把分配的空间初始化为0。

realloc用来修改一个已经分配的内存空间的大小。不管是扩大还是缩小,原来内存中的内容都不变。

11.3 一个例子:运行时输入一个数组

#include<stdlib.h>
#include<stdio.h>
int
compare_integers (void const *a, void const *b)
{
int const *pa = a;
int const *pb = b;
return *pa > *pb ? 1 : (*pa < *pb ? -1 : 0);
}
int
main ()
{
int *array;
int n_values;
int i;
printf("How many values are there? ");
if (scanf("%d", &n_values) != 1 || n_values <= 0) {
printf("Illegal number of values.\n");
exit(EXIT_FAILURE);
}
array = malloc(n_values * sizeof(int));
if (array == NULL) {
printf("Can't get memory for that many values.\n");
exit(EXIT_FAILURE);
}
for (int i = 0; i < n_values; i++) {
printf("? ");
if (scanf("%d", array + i) != 1) {
printf("Error reading value #%d\n", i);
free(array);
exit(EXIT_FAILURE);
}
}
qsort(array, n_values, sizeof(int), compare_integers);
for (int i = 0; i < n_values; i++)
printf("%d\n", array[i]);
free(array);
return EXIT_SUCCESS;
}

执行结果

leo@leodeMBP lang_notes (master) $ ./a.out
How many values are there? 5
? 123
? 33
? -3
? 334
? 23
-3
23
33
123
334