如何做网站淘客推广,网站上传的图片不显示,网站标识描述可以填关键词吗,wordpress百科汉化目录 1.野指针
野指针的成因#xff1a; 2.规避野指针
3.assert断言 创作不易#xff0c;宝子们#xff01;如果这篇文章对你们有帮助的话#xff0c;别忘了给个免费的赞哟~
1.野指针
概念#xff1a;野指针就是指针指向的位置是不可知的#xff08;随机的、不正确的…目录 1.野指针
野指针的成因 2.规避野指针
3.assert断言 创作不易宝子们如果这篇文章对你们有帮助的话别忘了给个免费的赞哟~
1.野指针
概念野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的
野指针的成因 1.指针未初始化 #include stdio.h
int main()
{
int *p;//局部变量指针未初始化默认为随机值
*p 20;
return 0;
} 2.指针越界访问 #include stdio.h
int main()
{
int arr[10] {0};
*p arr[0];
int i 0;
for(i0; i11; i)
{
//当指针指向的范围超出数组arr的范围时p就是野指针
*(p) i;
}
return 0;
} 3.指针指向的空间释放 #include stdio.h
int* test()
{
int n 100;
return n;
}
int main()
{
int*p test();
printf(%d\n, *p);
return 0;
} 函数调用结束后为n开辟的空间释放即被系统回收此时指针p指向被释放的空间就成了野指针 2.规避野指针
当我们没有恰当的使用指针时指针也就成了野指针野指针就像一条野狗是非常危险的那我们要如何规避野指针呢~ 1.指针初始化 如果明确知道指针指向哪里就直接赋值地址如果不知道指针应该指向哪里可以给指针赋值NULL. NULL 是C语言中定义的⼀个标识符常量值是00也是地址这个地址是无法使用的读写该地址 会报错。 #ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif #include stdio.h
int main()
{
int num 10;
int*p1 num;
int*p2 NULL;
return 0;
} 2.小心指针越界 ⼀个程序向内存申请了哪些空间通过指针也就只能访问哪些空间不能超出范围访问超出了就是越界访问。 3.指针变量不再使用时及时置为NULL指针使用之前检查有效性 当指针变量指向⼀块区域的时候我们可以通过指针访问该区域后期不再使用这个指针访问空间的时候我们可以把该指针置为NULL。因为约定俗成的⼀个规则就是只要是NULL指针就不去访问同时使用指针之前可以判断指针是否为NULL。 我们可以把野指针想象成野狗野狗放任不管是非常危险的所以我们可以找⼀棵树把野狗拴起来就相对安全了给指针变量及时赋值为NULL其实就类似把野狗栓前来就是把野指针暂时管理起来。 不过野狗即使拴起来我们也要绕着走不能去挑逗野狗有点危险对于指针也是在使用之前我们也要判断是否为NULL看看是不是被拴起来起来的野狗如果是不能直接使用如果不是我们再去使用。 int main()
{
int arr[10] {1,2,3,4,5,67,7,8,9,10};
int *p arr[0];
for(i0; i10; i)
{
*(p) i;
}
//此时p已经越界了可以把p置为NULL
p NULL;
//下次使⽤的时候判断p不为NULL的时候再使⽤
//...
p arr[0];//重新让p获得地址
if(p ! NULL) //判断
{
//...
}
return 0;4.避免返回局部变量的地址 上面造成野指针的第三个原因也就是返回了局部变量的地址 3.assert断言
assert.h头文件定义了宏assert用于在运行时确保程序符合指定条件如果不符合就会报错终止运行。这个宏常常被称为“断言”。
assert(p!NULL) 上面代码在程序运行到这一行语句时验证变量 p 是否等于 NULL 。如果确实不等于 NULL 程序继续运行否则就会终止运行并且给出报错信息提示。
assert() 宏接受⼀个表达式作为参数。如果该表达式为真返回值非零 assert() 不会产生 任何作用程序继续运行。如果该表达式为假返回值为零 assert() 就会报错在标准错误 流 stderr 中写入⼀条错误信息显示没有通过的表达式以及包含这个表达式的文件名和行号。 assert() 的使用对程序员是非常友好的使用 assert() 有几个好处它不仅能自动标识文件和 出问题的行号还有⼀种无需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问 题不需要再做断言就在 #include assert.h 语句的前面定义⼀个宏 NDEBUG 。
#define NDEBUG
#include assert.h 然后重新编译程序编译器就会禁用文件中所有的 assert() 语句。如果程序又出现问题可以移除这条 #define NDBUG 指令或者把它注释掉再次编译这样就重新启用了 assert() 语 句。
assert() 的缺点是因为引⼊了额外的检查增加了程序的运行时间。一般我们可以在 Debug 中使⽤在 Release 版本中选择禁用 assert就行在 VS 这样的集成开 发环境中在 Release 版本中直接就是优化掉了。这样在debug版本写有利于程序员排查问题 在 Release 版本不影响用户使用时程序的效率。
5.完结散花
好了这期的分享到这里就结束了~
如果这篇博客对你有帮助的话可以用你们的小手指点一个免费的赞并收藏起来哟~
如果期待博主下期内容的话可以点点关注避免找不到我了呢~
我们下期不见不散~~