C 常量数组变量的运行时异常
我想知道在以下情况下发生了什么: 我有以下功能:C 常量数组变量的运行时异常,c,arrays,pointers,constants,C,Arrays,Pointers,Constants,我想知道在以下情况下发生了什么: 我有以下功能: void some_func(const int * a, int len_of_a) { int * b = (int *) a; b[1] = 3; } a是指向常量int的指针,所以假设我不能更改数组a中的任何内容。但是我试着调整指针,改变里面的元素。代码进行编译,当它运行时,当我传入某个常量数组时,我会得到一个运行时异常 我想知道到底是什么导致了这个异常。该内存区域是否仅由操作系统标记为可读?或者是否存在导致此异常的硬件
void some_func(const int * a, int len_of_a) {
int * b = (int *) a;
b[1] = 3;
}
a是指向常量int的指针,所以假设我不能更改数组a中的任何内容。但是我试着调整指针,改变里面的元素。代码进行编译,当它运行时,当我传入某个常量数组时,我会得到一个运行时异常
我想知道到底是什么导致了这个异常。该内存区域是否仅由操作系统标记为可读?或者是否存在导致此异常的硬件支持?在幕后是什么?C++中的< P> >取决于代码< > > >代码>。如果它指向非常量数据,那么可以通过丢弃常量来修改它。如果它指向已声明的
const
,则它是
我不知道对我来说是否也是这样
这意味着,只有当你确信你正在处理的对象的一切时,你才应该抛弃constness。这显然不适用于接受
const
参数的常规函数。根据一般规则,如果您试图通过非const
类型的指针访问const
变量,则会生成
因此,程序行为将取决于传递给some_func()
的参数类型。如果它是常量
变量的地址,那么您的程序肯定会遇到UB。为了安全起见,如果您知道自己在做什么,请避免const
或避免修改const
在你的特殊情况下
当我传入某个常量数组时,我得到一个运行时异常
您面对的是UB,因为数组是const
,您不应该更改该数组的内容
也就是说,您需要确保访问正确的内存。在函数内部,编译器无法知道b[1]
是否为有效访问。您需要确保访问是有效的,即为指针分配了足够的内存,以便b[1]
是通过该指针的有效元素访问
相关,根据第6.7.3章的标准
如果试图通过使用具有非常量限定类型的左值来修改使用常量限定类型定义的对象,则该行为是未定义的
是的,
const
并不保证您不能更改数据,它只是防止意外更改数据,但您始终可以丢弃const
。但是您需要发布如何定义a
。内存区域可能标记为RO。显示调用代码和传递的“a”的定义。这是一个调试版本吗?您试图更改b[1]
中可能指向堆栈的值,如果您试图更改原始a
,您应该设置b[0]
或*b
,因此这取决于a
指向的对象是如何定义的,并且并不总是UB?@Motti更新了我的答案:-)我想我更感兴趣的是异常是如何生成的,比如幕后。我的意思是,我明白一个人不应该在他们的节目中做这样的事情。幕后到底发生了什么?比如说,这是用C编写的,在Linux上运行。操作系统是否跟踪所有常量结构并抛出异常?我的意思是,是的,这会产生未定义的行为。但在系统层面上实际发生了什么?
const int a1[] = { 1, 2, 3 }
some_func(a1, 3); // undefined behaviour
int a2[] = { 1, 2, 3 }
some_func(a2, 3); // OK