calloc,默认初始化为0
realloc,原地方不能扩建的话,直接拷贝迁移
01 calloc 默认初始化为0
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//1、calloc,不用初始化,一个指针直接引用
void test1()
{
int* p=calloc(10,sizeof(int));
for (int i = 0; i < 10;++i )
{
p[i] = i + 1;
}
for (int i = 0; i < 10; ++i)
{
printf("%d ", p[i]);
}
for (int i = 0; i < 10; ++i)
{
if (p)
{
free(p);
p = NULL;
}
}
}
void main() {
test1();
system("pause");
}
02 realloc 增加后,堆区要么增加,那么拷贝迁移(原地址不够)
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//2、
void test2()
{
int* p = malloc(sizeof(int) * 10);//malloc开辟一块4*10B
for (int i = 0; i < 10; ++i)
{
p[i] = i + 1;
}
for (int i = 0; i < 10; ++i)
{
printf("%d ", p[i]);
}
printf("\n%p\n", p);//看堆区初始地址
//malloc基础上扩展4*10B,因为越大越容易迁移,连续的大内存少
p = realloc(p, sizeof(int) * 10);
//看堆区地址是否变化,一不一样是随机的
//地址一样,就一样
//地址不一样,原地址新增的空间就不是紧连着的,而是到其他位置了
printf("%p\n", p);
for (int i = 0; i < 10; ++i)
{
printf("%d ", p[i]);
}
if (NULL != p) {
free(p);
p = NULL;
}
}
void main() {
test2();
system("pause");
}
首地址相同,没有迁移
首地址不同,发生迁移