ganzx 发表于 2022-8-27 22:40:48

为什么定义为const static就会报错?

如下图。为什么用const static修饰时会报错,而只用const或static时就不会?
https://tieba.baidu.com/photo/p?kw=%E7%85%A7%E7%89%87&flux=1&tid=7992675353&pic_id=b852fbf2b21193133a57666d20380cd790238ded&pn=1&fp=2&see_lz=1

ganzx 发表于 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 = 'a';
        printf("%s\n", p);
        printf("%s\n", arr);
}
新手传不了图片,太悲催了。报错信息如下:
引发了异常: 写入访问权限冲突。
p 是 0x537B30。

ganzx 发表于 2022-8-27 22:41:31

https://tieba.baidu.com/photo/p?kw=%E7%85%A7%E7%89%87&flux=1&tid=7992675353&pic_id=b852fbf2b21193133a57666d20380cd790238ded&pn=1&fp=2&see_lz=1

人造人 发表于 2022-8-28 00:08:44

本帖最后由 人造人 于 2022-8-28 00:11 编辑

ganzx 发表于 2022-8-27 22:42
#include

int main()


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

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

zhangjinxuan 发表于 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 = 'a'; //会RE
      printf("%s\n", p);
      printf("%s\n", arr);
}
报错的应该是 p='a' 这一行,因为这个p指针指向的是个常量,你修改p指向的字符串,肯定会报错
解决方法,去掉const
页: [1]
查看完整版本: 为什么定义为const static就会报错?