1.对NULL指针进行解引用操作
注意:错误示范!!!!!!
#include<stdio.h>
void main(void)
{
char* p = NULL;
printf("%c\n", *p); //对NULL进行解引用操作
printf("%c\n", 'a');
}
2.对动态开辟内存的越界访问
注意:错误示范!!!!!!
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i = 0;
int* p1 = (int*)malloc(sizeof(int)*10);
int* p2 = p1;if (p1 == NULL)
{
return 0;
}
else
{
for (i = 0; i < 10; i++)
{
*p2 = i;
p2++;
}p2 = p1;
for (i = 0; i < 11; i++) //动态开辟10个int的空间,但这里对第11个空间进行访问,所以产生访问越界
{
printf("%d\n", *p2);
p2++;
}free(p1);
p1 = NULL;
p2 = NULL;
return 1;
}
}
3.对非动态开辟内存使用free释放
注意:错误示范!!!!!!
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i = 0;
char str[20] = "hello";for (i = 0; i < 5; i++)
{
printf("%c\n", str[i]);
}free(str); //str是字符型数组,不是动态开辟的空间,free只能用于动态开辟内存的释放
return 1;
}
4.使用free释放动态开辟内存的一部分
注意:错误示范!!!!!!
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i = 0;
int* p1 = (int*)malloc(sizeof(int) * 10);if (p1 == NULL)
{
return 0;
}
else
{
for (i = 0; i < 10; i++)
{
*p1 = i;
p1++;
}free(p1);
p1 = NULL;return 1;
}
}
解析:程序奔溃,这段代码看上去没什么问题,但有一个大的问题就是在对开辟空间存储数据时,p1会移动,经过for循环后p1并不是指向动态开辟空间的首地址。free不能释放开辟内存的一部分。