野指针
野指针通常是因为指针变量中保存的值不是一个合法的内存地址而造成的
野指针不是NULL指针,是指向不可用内存的指针
NULL指针不容易用错,因为if语句很好判断一个指针是不是NULL
(注意:C语言中没有任何手段可以判断一个指针是否为野指针!)
野指针的由来
局部指针变量没有被初始化
#include <stdio.h>
#include <string.h>
struct Student
{
char* name;
int number;
};
int main()
{
struct Student s;
strcpy(s.name, "Delphi Tang"); // 这里的s.name未初始化
s.number = 99;
return 0;
}
使用已经释放过后的指针
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void func(char* p)
{
printf("%s\n", p);
free(p);
}
int main()
{
char* s = (char*)malloc(5);
strcpy(s, "Delphi Tang");
func(s);
printf("%s\n", s); // 在函数调用中指针已经释放
return 0;
}
指针所指向的变量在指针之前被销毁
#include <stdio.h>
char* func()
{
char p[] = "Delphi Tang";
return p;
}
int main()
{
char* s = func();//func为调用函数,都是局部变量,调用完成都销毁
printf("%s\n", s); // 已经被销毁
return 0;
}
我们在使用中一定要避免这些情况!