0

标识符是否在每种情况下都被 const 限定为只读存储?还是会根据运行时间确定?当我要写入“只读”内存时,究竟会发生什么和/或可能发生什么。

const char **cpp;
char *p;
const char c = 'A';
cpp = &p;
*cpp = &c;
*p = 0;

这段代码是否会在任何情况下修改 RO 内存?还是因为每次我执行它都不是 RO 内存所以这只是工作?如果是这样,如果 char 存储在 RO mem 中并且我正在执行此代码会发生什么?行为未定义,这甚至不是问题。但是这段代码是可执行的。所以我的问题是:修改只读内存会发生什么?

4

3 回答 3

2

这是未定义的行为,这意味着您无法确定会发生什么。

并且const变量不需要位于只读存储器中。

C11 6.7.3 类型限定符

如果尝试通过使用具有非 const 限定类型的左值来修改使用 const 限定类型定义的对象,则行为未定义。如果尝试通过使用具有非 volatile 限定类型的左值来引用使用 volatile 限定类型定义的对象,则行为未定义。

于 2013-08-16T08:49:56.280 回答
2

基本上,它取决于编译器。很可能 char 将进入堆栈并且不会是只读的(因此,const这意味着只是混淆类型转换,在可执行文件中没有任何内容)。堆栈永远不会是只读的。

如果您将 some 定义const为全局,它很可能会进入DATA也不是只读的段。因此,您将再次使其全部正常工作。尽管我可以想象编译器将所有 const 放入具有只读访问权限的特殊段中,但在这种情况下,您将遇到通常的访问冲突/段错误。

此外,您可能有一个聪明的编译器,它可以优化整个代码并用它的值替换任何出现的 const 变量名,在这种情况下,没有什么可以告诉修改这个变量。好吧,很可能编译器足够聪明,&c可以理解变量必须存储在某个地方。

请注意最可能可能的倍数。未定义的行为是未定义的行为,因此请阅读此答案,因为我们不知道会发生什么

于 2013-08-16T08:57:12.573 回答
1

首先,const不保证任何有关实现使用任何只读存储器技术的内容。它只是告诉编译器该变量是不可变的。然后编译器可以告诉什么时候打破这个不变量。编译器可能会做其他聪明的事情,比如优化和使用特殊的存储技术,但这都是特定于实现的细节。

于 2013-08-16T08:57:21.823 回答