- 主题:请问C能否做到编译时按const检查变量,但运行时可按照普通变量
就是类似 const uint8_t tag[16]; 的变量
打算在初始化赋值的时候用类型转换赋值 memcpy((uint8_t *)tag, "0123456789012345", sizeof(tag));
但运行时直接 Segmentation fault 了,valgrind 报告如下错误:
==1014== Process terminating with default action of signal 11 (SIGSEGV)
==1014== Bad permissions for mapped region at address 0x406A70
应该是加了const后,变量tag被放入了只读字段了。
请教有没有既能利用 const 的编译时检查功能,又不让它放入只读字段的方法呢?谢谢。
--
FROM 51.222.204.*
不想让别的地方修改,只在一个地方修改。
【 在 slowaction 的大作中提到: 】
: 你这需求不合逻辑
: 你用他的检查,你还要赋值
: 这检查完全没用上
--
FROM 51.222.204.*
多谢
最后用的办法是定义一个普通变量
然后再定义一个把类型转换成const的宏在别处使用。
【 在 slowaction 的大作中提到: 】
: 定义的时候不加const
: 传出去的时候决定加不加const
--
FROM 51.222.204.*
对 对 对, 为了工作更有意义(不可替代), 必须随时在代码用一些高深的技术.
【 在 gfkid 的大作中提到: 】
: 感觉这是准备挖个深坑
--
FROM 51.222.204.*
就是介个意思
【 在 Madlee 的大作中提到: 】
: 只许州官放火啊
--
FROM 51.222.204.*
曾经用过mprotect()尝试寻找过一个bug,弄成只读后那个地方100%炸,不弄只读的话偶尔炸。
但是修改的地方太多,头大,不想改。
你猜我后来怎么干的,就是那块空间我不用了,我再找块地方,然后就基本不怎么炸了。
在那个地方留了一大块注释,不知道谁接手了那坨代码,我也是从别人手里接过来的。
【 在 gfkid 的大作中提到: 】
: 嗯我转给gpt3.5了,回答如下
: 如果你在使用操作系统(如Windows或Linux)时遇到了只读地址的错误,那可能是由于操作系统的内存保护机制导致的。在这种情况下,你需要使用操作系统提供的特定机制来修改只读内存。
: 在Windows和Linux上,操作系统会将只读内存映射为只读页面,以防止对其进行修改。如果你想要修改这些只读内存,你需要使用操作系统提供的函数来更改内存页面的保护属性。
: ...................
--
FROM 51.222.204.*
多谢, 结构体方法也很好用
【 在 gfkid 的大作中提到: 】
: 又问了gpt4,似乎更好些
: 您遇到的问题是因为尝试修改了一个被声明为 `const` 的变量。在 C 语言中,`const` 关键字用于声明一个变量为常量,这意味着一旦初始化后,它的值就不能被修改。尝试修改一个 `const` 变量的值会导致未定义行为,通常会引发运行时错误,如您所遇到的 Segmentation Fault。
: 在您的例子中,`const uint8_t tag[16];` 声明了一个不可变的数组,然后您尝试使用 `memcpy` 来修改它的内容,这正是出错的原因。
: ...................
--
FROM 206.189.38.*