【问题标题】:Segmentation Fault (Core dumped) in c++C ++中的分段错误(核心转储)
【发布时间】:2012-06-24 10:52:12
【问题描述】:

此代码在执行时会显示预期的输出,但最后会打印segmentation fault (core dumped)

string str[4] = {
    "Home",
    "Office",
    "Table",
    "Bar"
};

for (int i = 0; i<5; i++)
{
    cout << str[i] << "\n";
}

输出

Home
Office
Table
Bar
Segmentation fault (core dumped)

分段错误(核心转储)的意义是什么。我搜了一下,好像在访问未分配内存的时候出现了这样的错误,那么,上面的代码有什么问题呢?

【问题讨论】:

  • 使用g++ -Wall -g编译和调试gdb

标签: c++ linux segmentation-fault


【解决方案1】:

你应该写:

for (int i = 0; i<4; i++) //0,1,2,3 = total 4 values
{
    cout << str[i] << "\n";
}

【讨论】:

  • 或者更好,#define NEL(array) sizeof(array)/sizeof(*array) ... for (int i = 0; i &lt; NEL(str); i++) ...
  • 我不相信宏...对不起。
  • 我不相信危险的信息重复,我的信念是软件工程的核心原则。
  • @RoeeGavirel:Jim 的上述宏作为函数实现起来很简单。此代码很糟糕,因为它将代码与特定数据集紧密耦合。您希望能够修改数据,而无需扫描代码以查找紧密耦合和需要修改的代码。
  • 你真的应该学会为编译器启用警告和调试信息(例如使用g++ -Wall -g)并学会使用调试器gdb
【解决方案2】:

C++ 数组是从 0 开始的,所以你不能访问 str[4],因为它的索引范围是 0-3。
你分配了一个数组,长度为 4:

string str[4]

那么你的循环必须在以下情况下终止:

i < 4

而不是i &lt; 5

【讨论】:

    【解决方案3】:

    计数器应该从零到三。 for循环需要修改。

    【讨论】:

      【解决方案4】:

      strstring[4],所以它有 4 个元素,这意味着索引 0-3 是有效的。您也在访问索引 4。

      【讨论】:

        【解决方案5】:

        您遇到分段错误,因为您尝试访问不存在的元素,即str[4] 可能的索引为 0-3。

        【讨论】:

          【解决方案6】:

          您正在访问超出数组末尾的数据。 str 是一个大小为 4 的数组,但您正在访问循环中的第五个元素,这就是您遇到 seg 错误的原因

          【讨论】:

            猜你喜欢
            • 2022-01-14
            • 2017-02-25
            • 2016-07-12
            • 2018-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多