在申请内存后,没有对内存进行初始化的话,这段内存中就存储着系统随机值。
int n = 5;
int* p = (int*)malloc(n * sizeof(int));
有两种给内存初始化的方式:
(1)直接for循环给内存中每个单元格赋值。
for (int i = 0; i < n; i++) {
p[i] = 1;
}
(2)以string.h头文件中的memset()函数实现内存初始化。
memset(初始化内存(void*),int value,unsigned int size);
//初始化内存:所要初始化的内存地址,也就是指向该内存的指针
//value:想要以什么值进行初始化
//size:想要初始化的内存大小(字节大小)
由于memset()函数是以字节为单位进行内存初始化的,所以memset(p,0,nsizeof(int))可以将所开辟的内存的每个字节初始化为0。
所以使用memset(p,1,nsizeof(int))并不是将一个单元格中的数据初始化为1,而是将每个字节初始化为1。
memset(p,1,n*sizeof(int));
//类型* 指针名 = (单元格解析大小 *)calloc(单元格数目,单元格大小);
int* p = (int*)calloc(n , sizeof(int));
double* p = (double*)calloc(n , sizeof(double));
//类型* 指针名 = (解析单元格大小*)realloc(要扩容的内存地址(指针名),扩容内存的目标总字节大小);
int* q = (int*)realloc(p,10*sizeof(int));
示例
//类型* 指针名 = (解析单元格大小*)realloc(要扩容的内存地址(指针名),扩容内存的目标总字节大小);
//原先内存为5*4=20字节,现在扩容到10*4=40字节。
p = (int*)realloc(p, 10*sizeof(int));// 方法(1) //error
if(p==NULL) exit(1);
int *q = (int*)realloc(p, 10*sizeof(int));//方法(2) //right
if(q==NULL) exit(1);
//free(指向要释放的内存的起始地址地指针);
int n = 5;
int* p = (int*)malloc(n *sizeof(int));
free(p);//p存放的就是所开辟内存的起始地址
p = NULL;