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