繁体   English   中英

尝试动态分配二维字符数组时出现分段错误

[英]Segmentation fault when trying dynamically allocate 2d char array

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

{
    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)并且我得到“分段错误”错误。 你能解释一下我做错了什么吗?

这离开了数组的末尾:

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

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

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

  • 如果可以避免,请不要使用 C arrays,请使用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++ 时,请尝试享受标准库 严重依赖容易出错的 C 技术相比,这将使您的生活更加轻松。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM