重点内容
野指针:未经初始化的指针,因为是一个局部变量,存储于栈空间,地址由系统随机分配。易造成内存泄漏错误,程序编译执行时出现的段错误原因之一便是由于在程序中存在野指针。
如何避免野指针?
养成良好的编码规范:
(1)、当指针未确定指向时,要将其初始化为空:NULL(零地址,不能对其进行操作和赋值),这样能够在出现段错误时引起编程人员的注意,以便发现问题。
(2)、当向指针指向的内存空间赋值时,要先确定其是否分配空间,若未分配空间要先对其分配空间:使用malloc() 例:char *ptr = malloc(100); malloc(100)返回值是所分配空间的地址。
char *ptr = (char *)malloc(sizeof(char) * 100);
注意:出现不兼容指针类型赋值原因是:指向不同数据类型的指针之间进行赋值。(char *)保证两个指针之间类型相同。
void *------万能指针,可保存任何类型指针的值,但不能对其进行取值操作
(3)、进行分配空间后要检查空间分配是否成功(以ptr为例),若不成空则ptr为空,要退出程序;
int main()
{
char *ptr = (char *)malloc(sizeof(char) * 100);
if (ptr == NULL)
{
printf("malloc error!");
exit(1);
}
scanf("%s",ptr);
printf("%s",ptr);
return 0;
}
(4)、分配空间使用完之后要进行清空
memset(空间地址,要插入的字符,空间尺寸)
(5)、用完空间要释放:
free(ptr);
(6)、释放后要将其重置为空:
ptr = NULL;
例:`
int main()
{
int *a[3]; //指针数组,注意对里面的指针元素分配空间;避免出现野指针
int i;
for(i = 0; i < 3; i++)
{
a[i] = (int *)malloc(sizeof(int) );//malloc分配空间
if(a[i] == NULL) //判断空间是否分配成功
{
printf("malloc error!");
exit(1);
}
scanf("%d",a[i]);
}
for(i = 0; i < 3; i++)
{
printf("*a[%d] = %d\n",i, *a[i]);
free(a[i]); // 释放分配的空间
a[i] = NULL; // 将释放的空间置为零地址
}
return 0;
}`