动态分配内存
1.malloc函数
void *malloc(size_t size);
函数参数是要分配的内存数,返回一个指向被分配的内存块起始位置的指针,分配的是一块连续的内存。若无足够的内存,返回NULL指针。
2.free函数
void free( void *pointer);
函数的参数为malloc、calloc、realloc返回值或NULL。
释放整块动态内存的一部分是不允许的。
3.calloc函数
void *calloc(size_t num_elements, size_t element_size);
作用同malloc,参数为元素数量和大小,返回指向内存指针之前把它初始化为0。
4.realloc函数
void realloc(void *ptr, size_t new_size);
函数用于修改一个原先已经分配的内存块的大小。
扩大内存块,原先内容将会保存,新内容加到后面;缩小内存,内存块尾部将会被拿掉;无法改变大小,将原先的内容复制到新内存块上,所以要改用函数返回的新指针。
5.分配内存
int *pi;
pi = malloc( 100 );
/*pi为int类型占4个字节,pi就为25整型元素的数组*/
pi = malloc( 25 * sizeof(int));
/*得到能够存储25个整数的内存
数组可使用指针或下标进行初始化
*/
6.检查错误的内存分配器实现
alloc.h
#include <stdio.h>
#define malloc
/*防止其他代码块直接塞入程序导致的偶尔直接调用malloc行为*/
#define MALLOC(num,type) (type *)alloc( (num) * sizeof(type) )
/*参数为元素数目和元素类型,返回总的内存数目*/
extern void* alloc(size_t size);
alloc.c
#include <stdio.h>
#include "alloc.h"
#undef malloc
/*调用malloc不出错*/
void* alloc(size_t size)
{
void* new_mem;
new_mem = malloc(size);
if (new_mem == NULL) {
printf("out of memery!");
exit(1);
}
return new_mem;
}
void function()
{
int* new_memory;
new_memory = MALLOC(25, int);
}
7.内存分配实例
#include <stdio.h>
#include <stdlib.h>
int compare_integers(void const* a, void const* b)
{
register int const* pa = a;
register int const* pb = b;
return *pa > *pb ? 1 : *pa < *pb ? -1 : 0;
}
int main()
{
int* array;
int n_value;
int i;
printf("how many values are there?");
if (scanf("%d", &n_value) != 1 || n_value <= 0) {
printf("illegal number of value.\n");
exit( EXIT_FAILURE);
}
array = malloc(n_value * sizeof(int));
if (array == NULL)
{
printf("can't get memory for that many values. \n");
exit(EXIT_FAILURE);
}
for (i = 0; i < n_value; i += 1)
{
printf("? ");
if (scanf("%d", array + 1) != 1) {
printf("Error reading value #%d\n", i);
free(array);
exit(EXIT_FAILURE);
}
}
qsort(array, n_value, sizeof(int), compare_integers);
for (i = 0; i < n_value; i += 1)
{
printf("%d\n", array[i]);
}
free(array);
return EXIT_SUCCESS;
}
8.小结
动态分配内存允许程序为一个长度在运行时才知道的数组分配内存。