1.动态存储分配
1.1.内存分配函数
在stdlib.h中声明
(1)malloc():分配内存块,不初始化分配的内存块
(2)calloc():分配内存块,且对内存块进行清除
(3)realloc():调整之前已分配的内存块
malloc不需要对已分配的内存块进行清除
1.2.空指针
调用内存分配函数时,可能会出现出发对所需的最大的内存块进行定位,出现这样的问题,就会返回空指针。
2.动态分配字符串
(1)使用malloc()函数分配
调用该函数分配内存,但没有为其指定名字。而是返回分配的内存区中的一个字节的地址,该地址可以被赋值给一个指针变量,通过指针访问内存。
malloc()函数原型:
void *malloc(size_t size)
(2)字符串函数中使用动态存储分配
//定义一个函数,希望不改变任何一个字符串而完成字符串的拼接
char *newStr;
newStr =(char *) malloc(strlen(s1) + strlen(s2) + 1);
if (newStr==NULL)
{
printf("ERROR");
exit(EXIT_FAILURE);
}
strcpy(newStr, s1); //s1复制到新内存区
strcat(newStr, s2); //s2拼接到新字符串后面
3.动态分配数组
3.1.使用malloc分配
//使用malloc 函数申请40个float类型内存空间,使用指针p指向该空间所在位置
float *p;
p=(float*) malloc (40*sizeof(float));
3.2.calloc()函数
函数原型
void *calloc(size_t nmemb, size_t size);
成功分配内存后,该函数会将内存块中的所有位都置0以完成初始化。
long *new;
new=(long*)calloc(100,sizeof(long));
3.3.realloc()函数
函数原型
void *realloc(void *ptr, size_t size);
调用该函数时,指针ptr必须是已经指向了某个内存块,且该内存块必须是之前调用malloc()\calloc()\realloc()函数时分配的。size表示内存块的新尺寸。
如果不能成功完成内存块的扩充,则返回空指针。
如果调用realloc()时将其第一个实际参数设置为空指针,则realloc()就为malloc().
如果调用时以0作为第二个参数,则该函数负责释放掉内存块。
4.释放内存
4.1.free()函数
free()的实参必须是指针,且必须是由free之前的内存分配函数返回的。
4.2.“无效指针”
free()释放了不再需要的内存,节省堆空间。但是指针它的指针仍然存在,指向的仍是之前释放掉的空间。