以下所介绍的函数,头文件均为stdlib.h,所开辟空间均在堆上。
一.malloc函数
void * malloc(size_t size);
这个函数向内存申请一块连续可用的空间,并返回指向这片空间的指针。
如果开辟成功,返回指针;
如果开辟失败,返回NULL;
void free(void * ptr);
用来释放所申请的内存。
测试代码
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#pragma warning(disable:4996)
int main()
{
int num,i=0;
int * ptr;
scanf("%d", &num);
ptr = (int *)malloc(num * sizeof(int));
if (ptr != NULL)
{
for (; i < num; i++)
{
*(ptr + i) = i + 1;
}
for (i=0; i < num; i++)
{
printf("%d\n", *(ptr + i));
}
}
else {
printf("error!");
}
free(ptr);
system("pause");
return 0;
}
二.calloc函数
与malloc函数功能相同。
void * calloc (size_t num, size_t size);
与malloc的不同:1.申请num个size大小的空间;
2.申请成功后,将这一空间内全部初始化为0。
三.realloc函数
对已申请的动态空间,灵活做大小调整。
void * realloc(void * ptr , size_t size);
- ptr为要调整空间的指针;
- size为调整之后的新大小;
- 返回值为调整之后动态空间指针;
- 尽量使用中间变量判空,在保存新的指针;
int * p;
p = realloc(ptr,size);
if(p != NULL)
{
ptr=p;
}
free(ptr);
四.注意TIP
- free之后,空间内容并没有立即清空,指针也还指向该空间;
- 可在子函数动态申请空间,注意要传二级指针。
char * aaa(char **p)
{
*p = (char *)malloc(100);
}
int main()
{
char * str = NULL;
aaa(&str);
if (str != NULL)
{
strcpy(str, "hello");
printf(str);
}
free(str);
return 0;
}