动态内存
1.free(NULL),传入空指针,则函数什么也不做
2.malloc和free建议成对使用
3.free(p) free掉p指针指向的内存空间,但P指针仍然指向所释放的空间,形成野指针,所以要p = NULL
4.动态开辟内存忘记释放(内存泄漏)
void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while(1);
}
p指针指向开辟的空间,test()函数结束时,即使想释放malloc出来的空间也无法释放,因为p是局部变量出了函数被销毁,忘记释放造成了内存泄漏
6.realloc
如果后边没有足够的空间,realloc会拷贝旧空间的数据到新空间的位置,并且释放旧空间,同时返回新空间地址
柔性数组
柔性数组的特点:
结构中的柔性数组成员前面必须至少一个其他成员。
sizeof
返回的这种结构大小不包括柔性数组的内存。
包含柔性数组成员的结构用
malloc ()
函数进行内存的动态分配,并且分配的内存应该大于结构的大
小,以适应柔性数组的预期大小。
struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));
struct S
{
int n;//4
char arr[];//数组的大小是未知 - 柔性数组成员
};
int main()
{
//printf("%d\n", sizeof(struct S));
struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));
ps->n = 100;
int i = 0;
for (i = 0; i < 10; i++)
{
ps->arr[i] = 'Q';
}
//
for (i = 0; i < 10; i++)
{
printf("%c ", ps->arr[i]);
}
//增容
struct S* ptr = (struct S*)realloc(ps, sizeof(struct S)+20*sizeof(char));
if (ptr != NULL)
{
ps = ptr;
}
else
{
perror("realloc");
return 1;
}
//使用
//释放
free(ps);
ps = NULL;
return 0;
}