C语音初阶————指针2
8月25日学习总结:
学习内容主要围绕野指针开展,主要分为三个部分介绍野指针:
(1)野指针的概念:野指针就是指针指向的位置是不可知的。(随机的,不正确的,没有明确限制的)
(2)野指针的类型:
①未初始化,意味着没有明确指向(非法访问),当一个局部变量不初始化的话,默认赋值随机值。
int main()
{int* p;*p = 100; //该指针为野指针,非法访问return 0;
}
②指针越界访问:当指针的范围超过界限该指针为野指针。
int main()
{int arr[10] = { 0 };int* p = arr;int i = 0;for (i = 0; i <= 10; i++){//当i=10时指针p越界了,该指针为野指针*p = 1;p++; //相当于 *p++=1;//(*p)++和*p++的区别:前者是*p的值++,后者为p++后取地址}return 0;
}
③指针指向的空间释放:子函数中的局部变量在出函数的时候就销毁(将地址归还给内存,当该地址不使用内容暂时不改变),该指针变量为野指针。
int* test()
{int a = 10;return &a;
}
int main()
{int* p = test();//局部变量销毁,内存归还给内存,但当地址不使用内容不变return 0;
}
(3)如何避免野指针出现?
养成良好的习惯:
①指针初始化,当不知道赋何值时为空指针,默认空指针为NULL
②小心指针越界
③避免返回局部变量的地址
④指针使用之前坚持有效性
int* test()
{int a = 10;return &a;
}
int main()
{int* p = NULL;// p = 100; //对空指针进行赋值会报警告,很大可能会赋值失败int* pt = test();//printf("haha\n");//printf("hello\n");//打印一个或者两个后面的*pt的值不同;if (pt != NULL){printf("%d\n", *pt);//当在函数调用后没有打印任何东西该值依旧为10,否则为随机值}return 0;
}