1.对null指针进行解引用
void test ()
{
int *p = (int *) malloc (INT_MAX/4);
*p = 20 ; //如果p的值是NULL,就会有问题
free (p);
}
2.对动态开辟的空间进行越界访问
void test ()
{
int i = 0 ;
int *p = (int *) malloc (10*sizeof(int));
if(NULL == p)
{
exit (EXIT_FAILURE);
}
for (i =0 ; i <=10 ; i ++)
{
* (p+i ) = i ; //当i是10的时候越界访问
}
free (p);
}
3. 对非动态开辟的内存进行free释放
void test ()
{
int a = 10 ;
int *p = &a ;
free (p);
}
4.使用free释放一块动态开辟内存的一部分
void test ()
{
int *p = (int *) malloc (100);
p++ ;
free (p); //p不再指向动态内存的起始位置
}
注意这里p++会进行自增,那么最后p指向的位置是p+1的地址,还有一个int类型字节的空间没有被释放
5 对同一块动态内存多次释放
void test ()
{int*p= (int*) malloc(100);
free(p);
free(p); //重复释放
}
6 动态开辟内存忘记释放(内存泄漏)
void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while(1);
}