一、关于动态内存分配的定义(用时分配,不用释放)
所谓动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
二、相关函数
1、malloc()函数
函数原型:void *malloc(unsigned int num_bytes);
参数:num_bytes 是无符号整型,用于表示分配的字节数。
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
功能:分配长度为num_bytes字节的内存块
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
实例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
int main()
{
char *p = NULL;
p =(char*) malloc(10);
if (p)
printf("开辟成功!\n");
else
printf("开辟失败!\n");
strcpy(p, "hello!");
printf("%s\n", p);
free(p);
p = NULL;
system("pause");
return 0;
}
2、realloc()函数
原型:extern void *realloc(void *mem_address, unsigned int newsize);
语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。
头文件:#include <stdlib.h> 有些编译器需要#include <malloc.h>
功能:先判断当前的指针是否有足够的连续空间,如果有,扩大当前指针指向的地址,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来指针所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
注意:当内存不再使用时,应使用free()函数将内存块释放。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
int main()
{
char *p = NULL;
p =(char*) malloc(10);
if (p)
printf("开辟成功!\n");
else
printf("开辟失败!\n");
strcpy(p, "hello!");
printf("%s\n", p);
char*new_p = (char*)realloc(p, 20 * sizeof(char));
if (new_p == NULL)
{
printf("扩大失败!");
}
else
printf("扩大成功!\n");
strcpy(new_p, "nice to meet you!");
printf("%s\n", p);
p = new_p;
free(p);
p = NULL;
system("pause");
return 0;
}
3、calloc()函数
函数原型:void *calloc(size_t n, size_t size);
与malloc函数的区别:动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
int main()
{
int *pn = NULL;
int i = 0;
pn = (int*)calloc(10, sizeof(int));
for (i = 0; i < 10; i++)
{
printf("%d ", pn[i]);
}
free(pn);
pn = NULL;
system("pause");
return 0;
}