我将此代码放在我的 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) 您的编译器没有警告您将其分配给 char*
而不是 const char*
或 (ii) 您忽略了警告。
char str[10] = "SomeTHing";
在堆栈上分配缓冲区,包括空终止符。更改其内容已定义,但如果您想使用依赖于它的一些字符串库函数(例如strlen
),则需要保持空终止符完整。
关于c - 在动态数组上使用 tolower() 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25909130/