1.我们如果想获得一块可大可小,空间不够了可以增加,空间大了可以缩小
应该如何实现呐?
int val = 20;//在栈空间上开辟四个字节
char arr[10] = {0};//在栈空间上开辟10个字节的连续空间
这样只能获得固定的空间,程序一跑空间就改变不了。
2.c语言为我们提供了一组库函数来实现这一目标:
关于malloc是如何申请内存的,推荐看这篇文章,写的超级棒
自己动手实现一个malloc内存分配器 - 码农的荒岛求生的文章 - 知乎
https://zhuanlan.zhihu.com/p/367060283
此时tmp指向一块开辟好的40个字节的空间
#include
#include
int main()
{
int *tmp=(int *)malloc(40);
//malloc有可能开辟失败,使用前一定要进行判断
//不能直接使用tmp,tmp可能是空指针,对空指针解引用会出现错误
if (tmp == NULL)
{
printf("%s", strerror(errno));
return 0;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*(tmp + i) = i;
printf("%d ", *(tmp + i));
}
//释放
free(tmp);
tmp = NULL;
return 0;
}
因此使用realloc时候一定注意是否原空间地址改变
#include
int main()
{
int *tmp=(int *)malloc(40);
int i = 0;
for (i = 0; i < 10; i++)
{
*(tmp + i) = i;
printf("%d ", *(tmp + i));
}
int* pp=(int *)realloc(tmp, 80);
//此时不能直接写成
//tmp = pp;
//万一realloc开辟失败返回一个空指针,那么原来的
//40个字节都找不到了
if (pp != NULL)
{
tmp = pp;
//使用
for (i = 0; i < 20; i++)
{
*(tmp + i) = i;
printf("%d ", *(tmp + i));
}
}
//释放
free(pp);
pp = NULL;
return 0;
}
realloc也可以开辟一块空间,如
#include
#include
int main()
{
int *tmp= (int*)realloc(NULL, 40);
//这里也可以开辟一块空间
//效果和malloc一摸一样
if (tmp == NULL)
{
printf("%s", strerror(errno));
return 0;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*(tmp + i) = i;
printf("%d ", *(tmp + i));
}
free(tmp);
tmp = NULL;
return 0;
}
1.使用free释放一块动态开辟内存的一部分
//使用free释放一块动态开辟内存的一部分
int main()
int* p = (int* )malloc(40);
if (p == NULL)
printf("%s\n",
strerror(errno));
return 0;
}
int i=0;
//[1] [2] [3] [4] [5] [][] [][][]
for(i=0;i<5;i++)
{
*p=i+1;
p++;|
}
//释放
free(p);
p = NULL;
return 0;
}
最好不要让指向动态开辟的空间的起始位置的地址跑来跑去,否则释放不了,free只能释放起始位置的地址。想释放这块空间必须提供起始位置的地址
2 .对非动态开辟内存使用free释放
int main()
int arr[10] = { 1,2,3,4,5 };
int* p = arr;
//....
free(p);
p = NULL;
return 0;
这里p开辟的空间不在堆上不能释放
#include
#include
struct S
{
int n;
char C;
int arr[0];//柔性数组成员
};
int main()
{
// 8 + 40
struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int));
if (ps == NULL)
{
printf("%s\n",strerror(errno));
return 1;
}
//使用
ps->n = 100;
ps->C = 'w';
int i = 0;
for (i = 0; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d\n", ps->arr[i]);
}
//调整arr数组的大小
struct S* ptr = (struct S*)realloc(ps,sizeof(struct S) + 20 * sizeof(int));
if (ptr == NULL)
{
printf("%s\n",strerror(errno));
return 1;
}
else
ps = ptr;
//使用
//释放
free(ps);
ps = NULL;
}
可以动态的管理一块数组空间,个人感觉这个很有用