【问题标题】:Access violation strcpy [duplicate]访问冲突strcpy [重复]
【发布时间】:2019-10-24 08:05:21
【问题描述】:

每当我调用strcpy"SendEmail.exe " + log[1024] 转换为LCSTR 时,我都会遇到运行时违规异常。

我试过调试,结果成功了:

strcpy(CmdParams, ""+log[1024]);

char log[1024];
...
if (strlen(log) > 49)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    memset(&pi, 0, sizeof(pi));
    LPSTR CmdParams;
    strcpy(CmdParams, ""+log[1024]);
    CreateProcessA(NULL, CmdParams, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}

应该发生的事情是 strcpy 应该已经将值复制到 CmdParams 并且应该已经执行下一行。

【问题讨论】:

  • 表达式"SendEmail.exe " + log[1024]连接两个字符串。相反,它会将数组的第 1025 号元素的内容添加到字符串字面量产生的指针中。如果您想在 C++ 中进行简单的字符串连接,请使用 std::string。如果您使用 C 编程,则使用另一个足够大的数组并使用 strcpystrcat
  • 无论你是用 C 还是 C++ 编程(两种非常不同的语言,对于这个问题有两种截然不同的解决方案,所以以后请选择你的语言'重新实际编程),即使是对语言的基本了解也应该告诉你这是错误的。所以请退后几步,回到你的教科书,重新阅读有关字符串文字、数组和指针以及指针算术的章节。
  • 哦,更不用说CmdParams 是一个未初始化的指针。在那个小代码中,有很多未定义的行为实例。
  • @Someprogrammerdude 我如何将整个 log[1024] 连接到 C 中的 CmdParams 上?
  • 和 log[1024] 在数组之外...

标签: c winapi memory strcpy


【解决方案1】:

CmdParams 是一个指针。您没有分配任何内存来指向它,甚至根本没有初始化它。这就是您在strcpy() 上遇到访问冲突的原因。

试试这样的:

char log[1024];
...
int len = strlen(log);
if (len > 49)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    memset(&pi, 0, sizeof(pi));

    LPSTR CmdParams = (LPSTR) malloc(14 + len + 1);
    if (CmdParams)
    {
        strcpy(CmdParams, "SendEmail.exe ");
        strcat(CmdParams, log);
        /* or:
        strcpy(CmdParams, "SendEmail.exe ");
        strcpy(CmdParams+14, log);
        */
        /* or:
        sprintf(CmdParams, "SendEmail.exe %s", log);
        */
        CreateProcessA(NULL, CmdParams, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
        free(CmdParams);
    }
}

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 2021-02-16
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多