1.对空指针进行解引用操作
问题代码:
int main()
{
int* p = (int*)malloc(400000000000000);
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}
运行结果:
对空指针进行解引用会造成不可预知的后果,导致程序崩溃
所以在用指针p进行操作时,我们需要先检测这个指针是否2维空指针!!!
2.对开辟出来的空间的越界访问
int main()
{
int* p = (int*)malloc(40);
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
for (i = 0; i < 20; i++)//!!!
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}
运行结果为:
因为你只开辟出了40个字节,但是这里你访问到了80个字节,属于越界访问。于是就出现了乱码。
3.内存使用完,没有进行释放(内存泄漏)
int main()
{
while (1)
{
malloc(40);
}
return 0;
}
不要小看这个小小代码,在电脑上不要轻易运行,
因为在死循环里,始终连续开辟一个40个字节的空间,但是没有释放。
就会导致占用的内存逐渐增多,会让电脑变卡,甚至死机。
4.释放内存时,指针没有指向原来空间的首地址(释放开辟的空间的部分内存)
代码如下:
int main()
{
int* p = (int*)malloc(40);
int i;
for (i = 0; i < 10; i++)
{
*p++ = i;
}
free(p);
p = NULL;
return 0;
}
运行时,程序就会报错。
5.对非动态开辟的内存进行释放
int main()
{
int a = 10;
int* p = &a;
free(p);
p = NULL;
return 0;
}
6.对同一块内存的多次释放
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
return 0;
}
free(p);
free(p);
return 0;
}
为了避免以上的错误,我们要养成释放后改为空指针的习惯
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
return 0;
}
free(p);
p = NULL;
free(p);
return 0;
}
第一次释放之后p改为了空指针
再次对空指针释放时,不进行任何操作。