【问题标题】:Segmentation Fault while using tolower() on dynamic arrays [duplicate]在动态数组上使用 tolower() 时出现分段错误 [重复]
【发布时间】:2014-09-18 09:35:44
【问题描述】:

我将此代码放在我的 C 编译器 (Dev Cpp) 上。

char *str = "SomeTHing";
for(int i = 0; str[i]; i++){
   str[i] = tolower(str[i]);
}

这会导致分段错误,而如果我使用静态数组,

char str[10] = "SomeTHing";

循环工作正常。谁能说出为什么会这样?

【问题讨论】:

  • 不用tolower也可以复制。争取一个最小的例子。
  • 动态数组在哪里!

标签: c arrays tolower


【解决方案1】:

char *str = "SomeTHing";只读内存分配给指针str。以任何方式更改其内容都是未定义的行为。在您的系统上显示为崩溃。遗憾的是 (i) 您的编译器没有警告您将其分配给 char* 而不是 const char* 或 (ii) 您忽略了警告。

char str[10] = "SomeTHing"; 在堆栈上分配缓冲区,包括空终止符。更改其内容 已定义,但如果您想使用一些依赖于它的字符串库函数(如 strlen),则需要保持空终止符完整。

【讨论】:

    【解决方案2】:
    char *str = "SomeTHing";
    

    SomeTHing 放在内存的只读部分,并使str 成为指向它的指针,从而使对该内存的任何写入操作都是非法的。任何修改此行为的尝试都会导致未定义的行为。

    下面的案例

    char str[10] = "SomeTHing";
    

    这是有效的,因为将文字字符串放入只读内存并将字符串复制到堆栈上新分配的内存。它可能会存储在“初始化数据段”中,该段在程序运行时从可执行文件加载到可写内存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多