#include<stdio.h>
struct s
{
int a;
int arr[0];//柔性数组 未知大小,数组大小可以调整
};//用sizeof所计算的占空间四个字节,柔系数组在结构体中不占用内存
int main()
{
struct s*ps = (struct s*)malloc(sizeof(struct s) + 5 * sizeof(int));
//所开辟的空间连续
ps->a = 100;
int i = 0;
for (i = 0; i < 5; i++)
{
ps->arr[i] = i;
//printf("%d\n", ps->arr[i]);
}
struct s*ptr = realloc(ps, 44);
if (ptr != NULL)
{
ps = ptr;
}
for (i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10;i++)
{
printf("%d\n", ps->arr[i]);
}
free(ps);
ps = NULL;
return 0;
}
struct s
{
int n;
int*arr;
};
int main()
{
struct s *ps = (struct s*)malloc(sizeof(struct s));
ps->arr = malloc(10*sizeof(int));
//malloc函数每次开辟的空间并不连续
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]);
}
free(ps->arr);
ps->arr = NULL;
free(ps);
ps = NULL;
}
//常见动态内存错误
//1.对空指针解引用操作
int main()
{
int*p =(int*) malloc(40);
//万一malloc失败了,p就被赋值为NLULL。
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;//p就为空指针不能解引用 *p=0本身就是错误
}
free(p);
p = NULL;
return 0;
}
//2.对动态开辟的内存越界访问
int main()
{
int *p = (int*)malloc(5 * sizeof(int));
if (p == NULL)
{
return 0;
}
else
{
int i = 0;
for (i = 0; i < 10; i++)//这里只开辟5Int,但要用10个int
{
*(p + i) = i;
}
}
free(p);
p = NULL;
return 0;
}
//3.对非动态内存的free
int main()
{
int a = 10;
int *p = &a;
*p = 20;
free(p);
p = NULL;
return 0;
}
//4.使用free释放动态开辟内存的一部分
int main()
{
int *p = (int*)malloc(40);
if (p == NULL)
{
return 0;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*p++ = i;//此时p的所指向的位置不在起始的指向的位置
}
free(p);
p = NULL;
return 0;
}
//5.对同一块动态内存的多次释放
int main()
{
int *p = (int*)malloc(40);
if (p == NULL)
{
return 0;
}
free(p);//所以防止多次释放在释放指针时一定要p=NULL
//....
free(p);//
return 0;
}
//6.动态开辟内存忘记释放(内存泄漏)
int main()
{
while (1)
{
malloc(1);
}
return 0;
}