【问题标题】:Unhandled exception at 0x0f6cf9c4 in server.exe: 0xC0000005: Access violation reading location 0x00000001server.exe 中 0x0f6cf9c4 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000001
【发布时间】:2016-11-08 08:31:32
【问题描述】:

这是我在 Visual Studio 2008 中编写的代码。我在接收数组中获取数据并使用该数据,我正在准备响应它。但我收到错误“server.exe 中 0x0f6cf9c4 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000001。”每次代码运行时都在“strcat”函数处。

    byte Receive[50];
    unsigned char result[50]; 
    int index = 0;
    char *type;
    char *s =  "ff ff ff 1d 00 01 01 0b 00 01";
    char *s1 = "03 00 98 ac 06 36 6f 92";
    int i;


if (Receive[i] == 0x18)
    { 
        if ((Receive[i+1] == 0x20) || (Receive[i+1] == 0x21) || (Receive[i+1] == 0x22) || (Receive[i+1] == 0x23) || (Receive[i+1] == 0x24) || (Receive[i+1] == 0x25))
        { 
            if (Receive[i+2] == 0x00)
            {
                result[index] = Receive[i-4];`enter code here`
                result[index+1] = Receive[i-3];
                index = index+2;
                type = "report";
            }
        }
    }
}

index = 0;

if (type == "report")
{
        strcat(s, result[index]);
        strcat(s, result[index+1]);
        strcat(s, s1);
        strcat(s, array1[j]);
        strcat(s, array1[j+1]);
        strcat(s, array1[j+2]);
        strcat(s, array1[j+3]);
        strcat(s, array1[j+4]);

【问题讨论】:

  • 与您的问题无关,但您不能使用== 来比较字符串。使用==,您只比较指针,而不是它们指向的内容,因此它永远不会是真的。使用strcmp 比较字符串。
  • 至于您的问题,首先在调试器中运行您的程序,以“在运行中”捕获崩溃。这样您就可以在代码中找到它发生的位置,并检查变量及其值以确保它们看起来不错。至少请编辑您的问题,告诉我们崩溃发生的位置以及所涉及变量的值。

标签: c


【解决方案1】:

但是,导致崩溃的一个可能原因是您尝试修改字符串文字。

当您执行strcat(s, ...) 时,您修改了s 指向的字符串文字。字符串文字是由特殊字符'\0' 终止的只读固定大小字符数组。当您在strcat 调用中使用这样的字符串文字作为目标时,您将首先修改只读数组,然后写出数组的边界。这两件事都会导致未定义的行为

您需要创建自己的数组,该数组大到足以容纳您要写入的所有数据。并且不要忘记字符串终止符的空格。

此外您使用例如result[index] 作为字符串。 result 中的元素是单个字符,而不是指向字符串的指针。为此,您需要使用 strncat 仅连接单个字符。 并且你需要将一个指针传递给角色。取决于array1 是什么,可能会有类似的问题。


作为另一种可能的解决方案,您可能希望使用sprintf 而不是一系列无效的strcat 调用:

sprintf(dest, "%s%c%c%s%c%c%c%c%c",
        s,
        result[index],
        result[index+1],
        s1,
        array1[j],
        array1[j+1],
        array1[j+2],
        array1[j+3],
        array1[j+4]);

【讨论】:

    【解决方案2】:

    您不能strcat(s, result[index]); 因为没有分配给s 的内存来保存与其连接的额外数据,s 具有固定大小..

    另外,由于代码可能在函数内部,unsigned char result[50]; 是本地的,未初始化为零。所以它不是字符串,strcant 可能会失败。

    int i; 也是如此,它的值是不确定的,所以 Receive[i+1] 可能会失败。

    修复unsigned char result[50] = 0;int i=0;

    【讨论】:

      【解决方案3】:

      问题似乎与声明有关

      char *s = "ff ff ff 1d 00 01 01 0b 00 01";

      这个声明会将值放在内存的只读部分,并使 s 成为一个指针,指向使对该内存的任何写操作都非法的指针。

      当你在做 strcat(s, 结果[索引]);

      您正试图在内存的只读部分上写入,这反过来又会给您带来异常。您应该为 s 分配足够的内存,然后对其进行字符串操作。

      【讨论】:

        【解决方案4】:

        除了尝试连接到一个常量字符串(这会给你一个访问冲突写入一个远离零的位置),你的错误来源很可能是你传递单个字符作为strcat() 的第二个参数,而不是指针。如果您在执行此操作时至少没有收到来自编译器的警告,则表示您的编译器设置错误。

        如果您确实收到警告但忽略它们,则表示您的头脑设置不当。

        【讨论】:

          猜你喜欢
          • 2018-12-05
          • 2014-10-26
          • 2013-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多