调试-一些奇怪的现象-以及const的作用
创始人
2024-02-29 11:36:32

今天给大家看一些奇怪的例子,我们用调试来看看这到底是什么情况,本次选取环境为vs2019

话不多说,我们直接来看例子

#include int main()
{int i = 0;int arr[10] = { 0 };for (i = 0; i <= 12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}

大家先猜猜这段代码的运行结果吧。

正常情况,这个代码是错误的,产生了越界,但也是可以运行起来的,它会打印13个hehe,那是不是这样呢?我们来看结果

 ???大家肯定会很疑惑,这是什么情况?为什么会陷入死循环呢?别急,我们来一步一步看

我们先调试走到arr[10],然后接着往下看

 

 

我们看到,这个代码是非常危险的,它直接把arr[11]的内容给修改为0了,刚才的arr[10]也是同理,那么是不是下面的也是这样呢?

 

诶?为什么arr[12]里的值是12呢?是不是arr[12]里的随机值刚好是12?我们接着走一步

  

走完一步后发现,arr[12]的值变为了0,但是这个调试例子让我们发现此时的i也变成了0,很明显这不是巧合,刚才arr[12]里的12,就是i的值,这究竟是怎么一回事?我们来到内存看看

我们可以看到,这是数组在内存里的情况,此时的代码已经完成了arr[11]=0的赋值,我们仔细一数会发现有12个0,我们再来看看i的内存情况吧

 

是0c000000 ,刚好是12,说明此时i的值还是12,我们再结合上面的内存图来看会发现,在arr数组下面刚好也有个12,仔细看会发现地址是相同的,这是怎么回事?

我们知道,这些数组都是放在栈里面的,而栈的使用习惯是先使用高地址,再使用低地址,也就是说,这段代码会先给i放在高地址的空间里,然后把数组arr放在i前面的低地址空间里,而我们每次给数组+1后,随着数组下标的增长,会不断向高地址前进,越界后到达一定程度,会使得arr[i]到达i所在空间,此时赋值为0会修改i的值,导致循环出现问题,从而导致死循环,所以我们平时都要注意不要越界访问,否则是很危险的。

而且这段代码仅仅是在vs2019的情况下才会出现这种情况,我调换一下代码位置,比如说先创建arr,再创建变量i,也不会出现死循环,这段代码是设置好的,是特定的

 经过这段代码我们发现,i和arr之间刚好有2个整形空间,这是在vs2019的环境下,编译器的不同,也会导致结果的不同,经过测试,在vc6.0里,arr和i之间是没有空余空间的,在gcc里,i和arr之间有一个整形的空余空间。

这段代码是希望告诉我们,在我们遇到不明白的情况,要勇于调试自己解决问题,而不是遇到困难就放弃,或者之间去网上查,一定要先尝试自己解决,自己解决不了,再去寻求帮助,只有这样,才能成为一个好的程序员

知道了这些,我们接着来看一看const的作用

我们知道,变量加了const后会使变量无法修改

 但是我们学习了指针后就可以绕过const

这样就被人钻了空子,const不就没用了吗?

我们可以这样做

 

给指针也加上const,这样就无法通过指针修改变量a了 

或者这样,我们发现,const和int的位置并不影响,只要const在*左边就可以

const放在*的左边,const修饰的是指针指向的内容,表示指针指向的内容,不能通过指针来改变了,但是指针变量本身可以修改 

就像这样,a的值此时是不可修改,并且不可以通过修改指针p所指向a而直接修改a,但是指针本身是可以修改的,我们可以让它指向别的变量

 

但是指向别的变量后也是无法修改变量的

另外重新创建指针变量指向a,也是可以修改a的值的

知道了const在*左边的作用后,我们来看看const在*右边又是什么作用

 

 

根据这两段代码我们发现

const放在*的右边,const修饰的指针变量本身,表示指针变量本身的内容不能被修改,但是指针指向的内容,可以通过指针来改变。 

知道了const在左边和右边的区别后,我们可以这样写

 很有趣吧?

加入const,可以使代码变得更加安全,所以我们在看c语言库函数是怎么实现的时候,会发现很多都是加了const的,我们要多看源码,看优秀的代码,吸收他人的优点,站在巨人的肩膀上,才能看的更远

最后再补充一个知识

编程常见错误以及如何解决

1.编译型错误:直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

2.链接型错误: 

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误 

3.运行时错误: 借助调试,逐步定位问题。最难搞。

以上就是全部内容,希望大家可以有所收获。

如有错误,还请指正。

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...