最近我有一个问题,我知道指向一个常量数组的指针在初始化为下面代码中所示时,位于.rodata
区域,而该区域只能读取。
然而,在模式C11中,我看到在此内存地址写入会导致未定义的行为。
我知道Borland的Turbo-C编译器可以写入指针指向的位置,这是因为某些系统(如MS-DOS)上的处理器在实模式下运行吗?还是独立于处理器的操作模式?是否有其他编译器可以写入指针并且不会出现任何内存违规,即在保护模式下使用处理器?
#include <stdio.h>
int main(void) {
char *st = "aaa";
*st = 'b';
return 0;
}
在使用Turbo-C在MS-DOS中进行编译时,您将能够向内存中写入数据。
-d
选项打开了重复合并,则不能再向这些字符串常量写入数据,而应该将它们视为指向常量数据的指针。 - Michael Petch