申请内存malloc()在申请内存时不会对内存进行初始化赋值
在申请内存后,没有对内存进行初始化的话,这段内存中就存储着系统随机值。
int n = 5;
int* p = (int*)malloc(n * sizeof(int));
- malloc(size):size就是你想开辟的内存的字节大小。我们通常想要用这段内存存储n个某种类型的数据,所以如果我们想要用这段内存存储n个int大小(四字节大小)的数据(需要n*4字节内存),就使用malloc(n * sizeof(int))或malloc(n * 4)。
- (int):int就是你想要分割的单个格子大小*。系统不知道这段内存是单个一段,还是你想将其分为几个单元格。所以我们需要给系统明确我们想要怎么样,如果我们想要用这段内存存储int大小的数据,就用int标记,系统自动识别,将这段内存分隔为4字节大小的连续单元格。还因为这是开辟的内存地址,需要用指针来指向所以用(int*)将其强转为指针。
- int p*:对应想要存储的数据大小,就要选择对应指针解析存储单元大小相同,指针加整型能力相同的指针类型。malloc()将开辟好的内存起始地址返回回来,用指针进行保存。未成功开辟内存就返回一个空指针。
有两种给内存初始化的方式: (1)直接for循环给内存中每个单元格赋值。
for (int i = 0; i < n; i++) {
p[i] = 1;
}
(2)以string.h头文件中的memset()函数实现内存初始化。
memset(初始化内存(void*),int value,unsigned int 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));
示例
p = (int*)realloc(p, 10*sizeof(int));
if(p==NULL) exit(1);
int *q = (int*)realloc(p, 10*sizeof(int));
if(q==NULL) exit(1);
释放内存free()
int n = 5;
int* p = (int*)malloc(n *sizeof(int));
free(p);
p = NULL;
|