【问题标题】:Segmentation fault when trying dynamically allocate 2d char array尝试动态分配二维字符数组时出现分段错误
【发布时间】:2021-03-25 21:52:22
【问题描述】:

当我收到分段错误错误时,我已经编写了下一个类似的示例

{
    const char** var = NULL;
    const char* tmp = "Hello! How are you?";
    var = (const char**)malloc(5 * sizeof(char*));

    for (int i = 0; i < 5; i++)  
    {
        var[i] = (char*)malloc(50* sizeof(char));
        strcpy((char*)var[i], tmp);
    }
    for (int i = 0; var[i]; i++)
    {
        std::cout << (long int)var[i] << std::endl;
        std::cout << var[i] << std::endl;
    }
    // Free memory
    ....
    
}  

在第 6 次迭代中,for 循环没有停止(我预计 var[i]==NULL)并且我收到“分段错误”错误。你能解释一下我做错了什么吗?

【问题讨论】:

  • 这个崩溃在哪里?这就是调试器提供帮助的地方。
  • 这也不是 C。它似乎是 C++,因此重新标记。
  • 你为什么会期待var[6] == NULL
  • 正如彼得所指出的,你的财物内存可以是任何东西,不一定是 NULL。
  • (long int)var[i] 的意图是执行字符串到整数的转换,还是将该指针表示为数字只是为了看看它发生了什么?

标签: c++ arrays dynamic


【解决方案1】:

这会离开数组的末尾:

for (int i = 0; var[i]; i++)

越界访问var 是未定义的行为,可能导致崩溃。当您超出 JavaScript、Python 或 Ruby 中的界限时,您将不会得到一个漂亮、整洁的值,您会遇到问题。不幸的是,没有对此进行检查,因此您必须警惕不要无意中这样做,责任在您身上。

由于您显然使用的是 C++,因此您可以在此处解决很多问题:

  • 如果可以避免,不要使用 C 数组,使用 std::vector
  • 如果可以避免,不要使用 C 字符串,使用std::string

结合你得到的这个建议:

const std::string tmp = "Hello! How are you?";

std::vector<std::string> var;

for (int i = 0; i < 5; i++) {
  var.push_back(tmp);
}

for (auto& v : var) {
  std::cout << v << std::endl;
}

// No need to free memory, it's already handled for you.

当您编写 C++ 时,请尝试享受 Standard Library。它会让你的生活显着比严重依赖容易出错的 C 技术更容易。

【讨论】:

  • 但是我如何在 C 风格中做到这一点?
  • 非常小心并指出永远,永远会离开数组的末端。始终跟踪您可以使用的最大索引。通常这是通过使用size 变量来完成的,尽管还有其他方法,例如const 值。这真的取决于上下文是什么。
  • 这就像在山路上行驶,一侧的坡度非常陡峭,绝对没有障碍。怎么不开车下山?你非常注意自己在做什么。
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 2021-08-04
  • 1970-01-01
  • 2010-12-27
  • 2017-04-18
  • 1970-01-01
  • 2011-07-28
  • 2013-09-04
相关资源
最近更新 更多