鉴于以下程序。谁引发了分段错误?
int main() {
char *str = "hello word";
str[0] = 'a';
return 0;
}
上面的程序抛出了段错误。我知道它会抛出,因为只读段包含hello世界,并且它不能被修改。如果在L1缓存(处理器内)中完成从“h”变为“a”的存储指令,并且只有当页面从L3刷新到主存时,MMU才会进入画面,谁会立即抛出分段错误。
下面的代码是有效地做同样的事情,不会导致任何分段错误。为什么?
int main() {
char str[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
str[0] = 'a';
return 0;
}
那么,你的意思是缓存控制器正在抛出异常? – Boolean 2011-03-01 05:10:01
@Bala:无论如何,部分CPU无论如何 - 我不相信AMD或Intel会指定特定的异常来自缓存控制器还是“内存写入”功能单元。这种情况甚至可能因CPU而异。 – 2011-03-01 05:14:09
-1,第一个字符串分配在只读段中,第二个字符串分配在堆栈上。在这两种情况下,它都是字符数组。 – 2011-03-01 15:32:17