C中const 定义常量的使用
来源:互联网 发布:淘宝装修代码编辑器 编辑:程序博客网 时间:2024/05/01 04:41
- 先看如下代码
#include <stdio.h>#include <string.h>#define ARRSIZE(a) (sizeof(a)/sizeof(a[0]))int main(){ const int i = 10; int *p = (int *)&i; int a[i]; *p = 100; printf("%d\n", ARRSIZE(a)); printf("%d\t%d\n", i, *p); return 0;}
我用gcc编译运行,上面这段简单的代码的输出结果是:100 # 这也是一个很奇怪的结果。100 100这个结果说明了2个问题,1:可以用const变量作为数组大小;2:可以修改const变量的值。但难道真是这样吗?又或者说,难道在不同机器,不同编译器下都这样吗?并不尽然,首先这个程序在VC编译器下,不能通过,VC编译器不允许用const变量作为数组大小。即使把有关数组的给删掉,VC编译后的可执行文件不能执行,发生内存错误。这说明不可以修改const变量。因此这个是与编译器有关的。下面要思考的是:为什么gcc编译器能允许这事发生,而VC不允许。对上面的代码略做修改,将const int i = 10放到main函数外面去。#include <stdio.h>#include <string.h>#define ARRSIZE(a) (sizeof(a)/sizeof(a[0]))const int i = 10;int main(){ int *p = (int *)&i; int a[i]; printf("%d\n", ARRSIZE(a)); *p = 100; printf("%d\t%d\n", i, *p); return 0;}
这时gcc编译通过,运行出现段错误。段错误是经典错误,表明访问了不该访问的段。因此这说明全局的const变量不能修改;局部的const能修改。作如下推测:gcc下,全局的const变量存储于只读的数据段,因此肯定不能修改。局部的const存储在堆栈段,堆栈段是可读可写的;因此不能避免程序员去修改const。虽然局部const在堆栈,且堆栈可写,但如下方式却行不通:const int i = 10;i = 100; # 这里的错误是编译错误。因此编译器不允许你对局部const变量[直接]修改,它能够识别你在修改const变量。但正如前面的程序,你只要将局部const变量的地址赋给指针,就能骗过编译器了。而在VC下,const变量总是在只读数据段里。这时再来看数组#include <stdio.h>#include <string.h>#define ARRSIZE(a) (sizeof(a)/sizeof(a[0]))const int i = 10;int a[i]; // 将数组拿到main的外面来int main(){ printf("%d\n", ARRSIZE(a)); return 0;}
这时会有编译错误:error: variably modified ‘a’ at file scope如果将"int a[i]"放到main函数里,则正确。我还不太清楚这样的具体原因。这里我只能大致得出结论是:不能用const变量来作为数组大小。至于为什么将"int a[i]"放到main函数里时没有错误,我并不清楚,我看了下汇编码,发现gcc对这种情况进行了一些特殊的处理,并不是简单的分配堆栈空间,但更细致的原因,我并未深入研究。另外在VC下,是不能用const变量来作为数组大小的,不管是局部还是全局的const。因此不要试着去修改const变量,也不要用const变量来作为数组大小
0 0
- C中const 定义常量的使用
- C/C++中define定义的常量与const常量
- const定义的常量
- C/C++: const常量与define宏定义的区别
- OC中定义字符串常量使用const or #define
- php中const与define定义常量的区别
- PHP中const和define()定义常量的细节区别
- PHP中const和define()定义常量的细节区别
- PHP中定义常量的区别,define() vs. const
- PHP中const和define()定义常量的细节区别
- PHP中const和define()定义常量的细节区别
- PHP中const和define()定义常量的细节区别
- 使用const而不是宏来定义常量的好处
- const 总结——定义常量、函数的使用
- C语言 用const修饰符定义只读常量,只读常量与#define定义的符号常量的区别
- C语言使用字符串 常量的定义
- c语言const常量使用
- 宏定义常量与const定义常量的区别
- Mahout canopy聚类
- mysql密码忘记时如何修改密码(Linux&Windows)
- ExtJS小学识【多处收集供自己参考】
- shell中$0,$?,$!等的特殊用法
- 如何限制UITextField内输入的字数(很好很强大)
- C中const 定义常量的使用
- 暴雪战网协议更新:代练及第三方交易均违规
- 2014年安徽公务员面试热点:“雷锋超市”是激活志愿服务的制度创新
- 网络工程师交换试验手册之二十五:详细讲授利用xmodem来恢复IOS
- Qt下 QString转char*
- 将asp.net的后台cs代码移动到页面上
- 有关问题小结(22)-代码实现logcat保存
- Linux 高性能服务器编程——多线程编程
- 关于Ext的Combo加载数据的问题。