C语言关键字 inline 讲解?一定要防止踩到这几个屎坑!
const大家应该很容易理解,就是常量,它的目的是让我们期待的数据,不被意外的修改,如果修改就代表它是写错了,在运行时候出错。
我们来看个简单的代码, 然后分析下为什么会出现这个错误,它的实现机制是什么?
这个在编译的时候就报错了,系统检测出来是修改常量了。
然后我们把代码修改一下,然他能够编译通过。
编译有提示,但是可以编译通过,并且运行还能运行。大家一下子是不是觉得蒙圈了,const为什么还能修改,还不出错?
这才是我这一节真正想分享给大家的。我们的程序在内存中是以进程形态存在,在操作系统中记录。
然后我们的程序加载的时候,会有各种段,段里面会对应着几个属性,读,写,执行。
而我们前面说过,局部变量是在栈上面的,而栈是可读可写的,之前是可以执行的,后续限制了,原因是栈可以执行,之前黑客利用栈溢出,使用加载代码进入栈里面进行攻击系统。
但是栈上面的数据是可以修改的。所以这个程序是可以正常运行的。那么,我们调整下代码,
我搬到外面了,然后运行时候就挂了,提示异常。为什么呢?因为全局常量,编译器会把它放到.rodata段,这个段被加载进入内存后,是设定了只读,如果去写入,就会出错。
我们看代码:objdump -d hello
这里的数据从这个地址去拿,然后我们使用 objdump -h hello,看到这个630地址是在这个位置,
这个段是数据段,并且是需要申请,加载的,只读区域。这样子分析,是不是一目了然了,明白了原来如此。我们学习一定要深入挖掘本质,这样子才豁然开朗。
然后我们来看下几个常见的用法:
const int *p=&a;
int *const p=&a;
我们记住一个就明白了,const跟着是哪个类型,就是修饰哪个,用*前后分割。
第一个*前面是 const int 所以修饰int,也就是目标的数据不让改变。
这样子操作,在编译的时候就报错了,原因是 p指向了一个只读的int,但是我们去修改它,编译器就能检测出来,你是写错了。
这样子就可以修改,因为const修饰的是p这个指针。如果你去改动p指针,就出错了,
那么这个const的修饰,目的是什么呢?目的很简单,防止我们肆意的修改,比如我们传入了一个数组,这个数组传入方法,只是让你去读,不让你修改,那么就可以带上const这个限定。
那么,使用const的作用是什么呢?
1 防止被意外修改
2 便于系统检测,同时也便于使用者调用,明确知道数据不可修改
3 可以避免用户出错,添加的强调修饰
4 增加代码健壮性
学习了这么多,还不抓紧去应用下。我们默认把一些不动的常量,使用const去做修饰。使用最多的场景就是传参,传入时候进行限定,防止函数体里面对数据进行破坏。
以上就是今天想分享给大家的,不知道听明白了吗?下一节我们说下C和C++如何混合开发,大家可以持续关注,后续会有项目实战!
~~ end not end ~~
热门文章
职场老鸟,互联网十年从业生涯,分享 [Java,Python,安卓,AI,爬虫] 技术文章,学习资料, 热点趣闻等。关注回复 1024 Python 电子书大全 面试资料,给你一份私藏的程序员好礼,永远更新中!赶紧来关注哦!
我的微信 code_gg_boy 。