初识野指针
野指针通常是因为
指针变量中
保存的值
不是一个合法
的内存地址 而造成的
野指针不
是NULL指针,是指向不可用内存的指针
NULL指针不容易用错,因为if语句很好判断一个指针
是不是NULL
C语言中没有任何手段可以判断 一个指针是否为野指针!
野指针的由来
局部指针变量没有被初始化(没初始化,随机值,此时指针是乱指的)
#include <stdio.h>
#include <string.h>
struct Student
{
char* name;
int number;
};
int main()
{
struct Student s;
//s是局部变量,没有被初始化,里面还是随机值,name是指针,乱指的内存,不能写入东西
strcpy(s.name, "Delphi Tang"); // OOPS!
s.number = 99;
return 0;
}
优化后:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student
{
char* name; //不能在结构体声明时直接调用函数进行初始化
int number;
};
int main()
{
struct Student s;
s.name = (char*)malloc(sizeof(char) * (strlen("Delphi Tang") + 1)); // 分配足够的内存
if (s.name == NULL) {
// 处理内存分配失败的情况
return 1;
}
strcpy(s.name, "Delphi Tang"); // 现在可以安全地复制字符串了
s.number = 99;
// 使用完毕后,释放分配的内存
free(s.name);
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);
return 0;
}
指针所指向的变量在指针之前被销毁
#include <stdio.h>
char* func()
{
char p[] = "Delphi Tang";//局部数组
return p;//返回了这个数组的首元素地址,函数运行完毕指针被释放
}
int main()
{
char* s = func();//s指向func的首元素地址,但是这个数组已经被释放
return 0;
}