c++ - memcpy 导致程序因初始化目标而崩溃

标签 c++ crash memcpy char-pointer

我正在开发一个更大的程序,memcpy 导致它崩溃。我在一个小程序中复制了这种情况,它做了同样的事情。我注意到由于某种原因这个程序运行良好

// Runs fine
#include <iostream>

int main() {
    char* s1 = "TEST"; // src
    char* s2; // dest

    memcpy(s2, s1, strlen(s1) + 1);
    std::cout << s2 << std::endl; // Should print "TEST"

    return 0;
}

但是这个程序崩溃了

// Crashes
#include <iostream>

int main() {
    char* s1 = "TEST"; // src
    char* s2 = ""; // dest - Note the small change

    memcpy(s2, s1, strlen(s1) + 1);
    std::cout << s2 << std::endl; // Should print "TEST"

    return 0;
}

我不确定为什么会这样。有人可以解释为什么它会崩溃吗?

谢谢!

最佳答案

memcpy 导致错误的原因是您试图将 s1 的内容复制到字符串文字指向的内存中,这是未定义的行为, 因为字符串文字是不可写的,即使是,也没有足够的空间。

您的第一个代码也是无效的,因为它使 memcpy 成为未初始化指针指向的内存 - 又是未定义的行为。

您可以通过添加对 new 的调用来修复第一段代码,如下所示:

char* s2 = new char[strlen(s1)+1];

第二段代码可以这样修改:

char s2[5] = "";

关于c++ - memcpy 导致程序因初始化目标而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27752285/

相关文章:

ios - UITableView 在批量行和部分删除后请求幻影部分,导致崩溃

c++ - glMapBufferRange 卡住 OpenGL 驱动程序

C - 将两个结构附加到单个缓冲区

c++ - "glibc detected - double free or corruption"在复杂数组的 memcpy 期间

c++ - std::vector 是否调用对象指针的析构函数?

java - Bump API Android 崩溃

c++ - 如何在Visual Studio中添加 "Include directories"中的所有子目录?

c++ - 支持单个位偏移的类似“memcpy”的函数?

c++ - 防止 IOKit 驱动程序在 "kextunload"中关闭,除非某些客户端保持连接

c++ - 使用 Watershed 在 C++ 中进行 OpenCV 图像分割