我将此代码放在我的C编译器(Dev Cpp)上。
char *str = "SomeTHing";
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
这给出了分段错误,而如果我使用静态数组,
char str[10] = "SomeTHing";
循环工作正常。谁能说出为什么会发生这种情况?
答案 0 :(得分:5)
char *str = "SomeTHing";
将只读内存分配给指针str
。以任何方式更改其内容是未定义的行为。在您的系统上表现为崩溃。遗憾的是(i)您的编译器没有警告您将此分配给char*
而不是const char*
或(ii)您忽略了警告。
char str[10] = "SomeTHing";
在堆栈上分配缓冲区,包括空终止符。更改其内容是已定义,但如果要使用某些依赖于它的strlen
字符串库函数,则需要保持空终止符不变。
答案 1 :(得分:4)
char *str = "SomeTHing";
将SomeTHing
放在内存的只读部分中,并使str
指向该内存,使得对此内存的任何写入操作都是非法的。任何尝试修改它都会导致未定义的行为。
现在关注案例
char str[10] = "SomeTHing";
这是有效的,因为将文字字符串放在只读内存中并将字符串复制到堆栈上新分配的内存。它可能存储在一个“初始化数据段”中,该段在程序运行时从可执行文件加载到可写入内存中。