头文件:stdlib.h? string.h
一.申请动态分配内存malloc
stdlib.h 中定义函数void* malloc(size_t size) ,向系统申请大小为size 的内存空间。返回结果是void* ,使用时转换成需要的指针类型。如果申请失败,返回NULL 。
void 指针是一种特殊的指针,表示为“无类型指针”,任何类型的指针都可以直接赋值给 void 指针,而无需进行其他相关的强制类型转换,虽然如此,但这并不意味着可以无需任何强制类型转换就将 void 指针直接赋给其他类型的指针,要进行强制类型转换。
二.释放动态分配内存free()
#include<stdio.h>
#include<stdlib.h>
int main(){
int n;
scanf("%d",&n);
//int arr[n];
//malloc写法输入数组
int* arr = malloc(sizeof(int)*n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
for(int i=0;i<n;i++){
printf("%d",&arr[i]);
}
free(arr);
arr=NULL;
//不把指针设为NULL是可以的。但是如果你不巧再new/malloc申请分配到这块内存,就会发生不可预知的情况。
//所以释放后的指针为保证安全,要将其设为NULL,否则容易导致野指针的出现。
}
三.初始化动态分配内存calloc
在Linux中malloc和calloc都会分配
int* arr = (int*)calloc(n,sizeof(int));
free(arr);
近似于
int arr[n] = {0};
四.重新调整内存大小realloc
void* realloc (void* ptr, size_t size);
- 如果当前内存段后面有足够的内存空间,那么就直接扩展这段内存,
realloc() 返回原来的首地址; - 如果当前内存段后面没有足够的内存空间,那么系统会重新向内存树申请一段合适的空间,并将原来空间里的数据块释放掉,而且
realloc() 会返回重新申请的堆空间的首地址; - 如果创建失败,返回
NULL , 此时原来的指针依然有效;
|