上次我们谈论了有关指针的基本结构与用法,那紧更着上次的进度,我们来谈一谈野指针,assert断言以及与指针有关的计算。
博主来问大家个老幼皆知问题:在C语言中,我们称野指针为什么?┏ (^ω^)=☞
啥?野狗?没错,就是野狗! 在博主的眼里指针就是个警犬,用得好不知道会给你带来多大的便利,但一旦用不好,出现了野指针,那警犬就变成了野狗,看见人就咬。那这个时候我们就需要各种操作来控制这个野狗。assert断言就是其中的一个方法,相当于我们用绳子把野狗捆在树上,只要不靠近他就没有任何问题。诶,这时候就有调皮的铁汁好奇了:“那我把这条野狗捆在树上,再在他旁边尿尿,会咋样?[]~( ̄▽ ̄)~*”
...........( ̄ー ̄)ノ~~マ☆’.・.・:★ .........
对于这类兄弟,博主只能说:no do,no die (^_~)
OK,那么扯淡环节到此为止,现在博主开始正题了╰( ̄▽ ̄)╭!(你的文章根本没有正题好吧!)
在谈论野指针的时候,我们首先要知道野指针是什么:
全国统一给野指针的定义为: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
其中有这几种可能:
一.指针未初始化
如:
#include
int main() { int *p;//局部变量指针未初始化,默认为随机值 *p = 20; return 0; } 二.指针越界访问
如:
#include
int main() { int arr[10] = {0}; int *p = &arr[0]; int i = 0; for(i=0; i<=11; i++) { //当指针指向的范围超出数组arr的范围时,p就是野指针 *(p++) = i; } return 0; } 三.指针指向的空间释放
如:
#include
int* test() { int n = 100;//局部变量出函数范围即销毁 return &n; } int main() { int*p = test(); printf("%d\n", *p); return 0; }
以上三种则是三种常见的三种野指针,那关于野指针的危害博主其实在扯淡环节已经讲过了,这里不多赘述。那我们来看看怎么规避野指针:
一.指针初始化
如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL. NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错。
二.⼩⼼指针越界
⼀个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是 越界访问。
三.指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性
当指针变量指向⼀块区域的时候,我们可以通过指针访问该区域,后期不再使⽤这个指针访问空间的 时候,我们可以把该指针置为NULL。
四.避免返回局部变量的地址
如上方第三个例子,避免返回局部变量的地址。
五.使用assert断言
首先我们要知道使用 assert 需要引用头文件 #include
assert(p != NULL);
上⾯代码在程序运⾏到这⼀⾏语句时,验证变量 p 是否等于 NULL 。如果确实不等于 NULL ,程序 继续运⾏,否则就会终⽌运⾏,并且给出报错信息提⽰。
assert() 的使⽤对程序员是⾮常友好的,使⽤ assert() 有⼏个好处:它不仅能⾃动标识⽂件和 出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问 题,不需要再做断⾔,就在 #include 语句的前⾯,定义⼀个宏 NDEBUG 。
#define NDEBUG
#include
——— 我只是个分界线━━∑( ̄□ ̄*|||━━ ——
哈哈,那接下来继续我们的有关指针的计算:
还想我再讲一遍???不会的看博主上篇博客!!! ┻━┻︵╰(‵□′)╯︵┻━┻
(指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)(小声逼逼)。)
如:
#include
int my_strlen(char *s)
{
char *p = s;
while(*p != '\0' )
p++;
return p-s;
}
int main()
{
printf("%d\n", my_strlen("abc"));
return 0;
}
兄弟们觉得计算的结果是什么呢?
怎么样,是不是很好猜? 这时候就有兄弟总结了:“那指针减指针得到的不就是两个指针之间的元素个数嘛。” 对,太对了!趁机给屏幕前的自己鼓个掌(啪叽啪叽)(≧∇≦)ノ
如:
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = &arr[0];
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
while(p
没错,指针的比较比较的是所指向空间元素的大小。这段代码比较的是数组内每一项与最后一项的大小,所以打印的结果就是1,2,3,4,5,6,7,8,9,10。
okok,今天的内容就到此为止啦!兄弟们是不是受益匪浅呢?不是也没关系哦,因为......这就说明你已经比博主强啦!下篇博客继续给大家更新有关指针相关内容(指针数组,数组制作和函数指针),请大家继续支持不准备秃的大伟哦!三克油啦!!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
本篇博客也就到此为止了,送大家一碗鸡汤,勉励自己以及这世界上所有追逐梦想的赤子趁年华尚好努力提升自己,莫欺少年穷!