持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
malloc的用法
翻译出来的大概意思就是在内存当中申请一块连续可用的空间,返回这块空间的指针 如果开辟成功,则返回一个指向已经开辟空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void ,所以malloc函数并不知道开辟空间的类型,具体在使用的过程中,由使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器,这里我们写一个代码看看基本使用。
int main()
{
int* ptr = (int*)malloc(sizeof(int) * 4);
if (ptr == NULL)
{
return 1;
}
else
{
for (int i = 0; i < 4; i++)
{
ptr[i] = i;
printf("%d ", ptr[i]);
}
}
free(ptr);
ptr = NULL;
return 0;
}

注意:使用完一定要记得释放否则就造成内存泄漏。ptr在free之后仍然指向开辟的空间,但开辟的空间已经还回去了,所以我们要手动置成NULL,否则会影响下次的使用。
calloc的用法
这里可以看出参数size_t num为我们要的元素数量,size_t size为每个元素的大小,我们也写一段简单的代码
int main()
{
int* ptr = (int*)malloc(sizeof(int) * 10);
if (ptr == NULL)
{
return 1;
}
else
{
for (int i = 0; i < 4; i++)
{
ptr[i] = i;
printf("%d ", ptr[i]);
}
}
free(ptr);
ptr=NULL;
return 0;
}
再次注意://使用完一定要记得释放否则就造成内存泄漏。ptr在free之后仍然指向开辟的空间,但开辟的空间已经还回去了,所以我们要手动置成NULL;
calloc开辟出来的空间也是在堆区上,同然使用完之后要对内存进行释放,同理也要判断是否能开出了来,并置成NULL。
这里再给大家一个举一个开辟失败的例子
这里我在开2g内存的时候ptr返回NULL,如果这里我们没有对返回值做判断,使用的话就会造成错误,当然,想要开出2g或4g空间,只需要把x86改成64位就可以开辟出来了。
realloc
其中参数ptr是要调整的内存地址,size为调整之后的大小,注意,realloc有两种情况
第一种:原空间后面有足够大的空间
第二种:原空间后面没有足够大的空间
第一种:假设我们想要扩容一点,或者缩小空间,realloc帮我们处理好返回的依旧是处理前的地址,说明原空间后面有足够大的空间。
第二种:当我们开辟新的空间内存时,有可能因为后面空间不够,这个时候他会去另外一个地方找一块足够的空间,再将原来的内容拷贝过去,并且帮我们释放原来的空间,返回新开的空间的地址,说明原空间后面没有足够大的空间。
free的用法
调用形式:free(void*ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。
int main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
printf("Number=%d Name=%s ",ps->num,ps->name);
printf("sex=%c Score=%f ",ps->sex,ps->score);
free(ps);
}