鱼C论坛

 找回密码
 立即注册
查看: 2139|回复: 4

[已解决]为什么定义为const static就会报错?

[复制链接]
发表于 2022-8-27 22:40:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如下图。为什么用const static修饰时会报错,而只用const或static时就不会?

                               
登录/注册后可看大图
最佳答案
2022-8-28 00:08:44
本帖最后由 人造人 于 2022-8-28 00:11 编辑


const 是做什么用的?
你都用const告诉编译器说 你不修改这个变量,那编译器完全可以对这个只读变量做一些优化,一些检查
例如,编译器完全可以把这个变量放入只读存储区,在只读存储区的数据只能读不能写
你在下面强制写这个在只读存储区的变量,当然就出问题了

那你现在的问题是不是 为什么下面这个代码没问题?
         //const char arr[] = "7891111";//OK
很显然这个变量,编译器并没有把它放入只读存储区喽
那么编译器什么时候把const变量放入只读存储区,什么时候不放?
这个要看是什么编译器,也要看用的什么系统
有的系统就没有只读存储区这玩意
对于现在常见的系统,像windows,linux,mac,这些应该都有吧
一般来说,一个变量的生命周期和整个程序的生命周期一样,而且这个变量是const的,那就把这个变量放入只读存储区(很有可能就放在代码段,代码段就在只读存储区)
一般来说,static变量,编译器会放入数据区,而 const static 变量就放入只读存储区
如果只有一个const,是局部变量的话,就不放入只读存储区
是全局变量的话,就放入只读存储区
static变量的生命周期就是和这个程序的生命周期一样,所以static变量如果是const的,一般就会放入只读存储区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-27 22:42:44 | 显示全部楼层
#include <stdio.h>

int main()
{
        const static char arr[] = "7891111";//报错
        //const char arr[] = "7891111";//OK
        //static char arr[] = "7891111";//OK
        char *p = (char *)arr;
        p[2] = 'a';
        printf("%s\n", p);
        printf("%s\n", arr);
}
新手传不了图片,太悲催了。报错信息如下:
引发了异常: 写入访问权限冲突。
p 是 0x537B30。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-27 22:41:31 | 显示全部楼层

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-28 00:08:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 人造人 于 2022-8-28 00:11 编辑


const 是做什么用的?
你都用const告诉编译器说 你不修改这个变量,那编译器完全可以对这个只读变量做一些优化,一些检查
例如,编译器完全可以把这个变量放入只读存储区,在只读存储区的数据只能读不能写
你在下面强制写这个在只读存储区的变量,当然就出问题了

那你现在的问题是不是 为什么下面这个代码没问题?
         //const char arr[] = "7891111";//OK
很显然这个变量,编译器并没有把它放入只读存储区喽
那么编译器什么时候把const变量放入只读存储区,什么时候不放?
这个要看是什么编译器,也要看用的什么系统
有的系统就没有只读存储区这玩意
对于现在常见的系统,像windows,linux,mac,这些应该都有吧
一般来说,一个变量的生命周期和整个程序的生命周期一样,而且这个变量是const的,那就把这个变量放入只读存储区(很有可能就放在代码段,代码段就在只读存储区)
一般来说,static变量,编译器会放入数据区,而 const static 变量就放入只读存储区
如果只有一个const,是局部变量的话,就不放入只读存储区
是全局变量的话,就放入只读存储区
static变量的生命周期就是和这个程序的生命周期一样,所以static变量如果是const的,一般就会放入只读存储区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-28 09:01:18 | 显示全部楼层
#include <stdio.h>

int main()
{
         static char arr[] = "7891111";//正常执行
        //const char arr[] = "7891111";
        //static char arr[] = "7891111";
        char *p = (char *)arr; //正常执行
        p[2] = 'a'; //会RE
        printf("%s\n", p);
        printf("%s\n", arr);
}
报错的应该是 p[2]='a' 这一行,因为这个p指针指向的是个常量,你修改p指向的字符串,肯定会报错
解决方法,去掉const
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 23:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表