前言
动态存储分配函数头文件malloc.h(ANSI标准建议使用stdlib.h,但很多编译器可能不支持);
动态存储分配均是在堆上进行的;
free()用来释放这三个函数分配的内存空间;
malloc函数
分配指定大小的内存空间;
void* malloc (size_t size);
- size为0,会返回一个合法指针,且该指针可以通过free去释放;
使用:
int * p =null;
p= (int *) malloc(sizeof(int) * 10);
memset(p, 0, sizeof(int) * 10 );
calloc函数
分配指定大小的内存空间,将每一个字节都初始化为 0;
void* calloc (size_t num, size_t size);
使用:
int * p = (int *) malloc(sizeof(int) * 10);
realloc函数
对已经分配过的堆空间,重新分配内存空间;
void* realloc (void* ptr, size_t size);
- realloc运行时会复制原数据,寻找新的足够空间,成功后会释放原空间,失败不回收;
- 新的大小一定要大于原来的大小,不然的话会导致数据丢失!
- size为0,原空间会被释放,但无新的空间开辟,类似free();
- realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址;
使用:
int main ()
{
int input,n;
int count = 0;
int* numbers = NULL;
do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
count++;
numbers = (int*) realloc (numbers, count * sizeof(int));
//原内存被free,需要重新赋地址给原指针
if (numbers!=NULL) { //空间不足,分配失败,会返回NULL
numbers[count-1]=input;
}else {
free (numbers);
puts ("Error (re)allocating memory");
exit (1);
}
} while(input!=0);
printf ("Numbers entered: ");
for (n=0;n<count;n++) printf("%d ",numbers[n]);
free (numbers);
system("pause");
return 0;
}