这是我在Visual Studio 2008中编写的代码。我从Receive数组中获取数据,并使用该数据来准备响应。但是我收到错误消息“ 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]);

最佳答案

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

当您执行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]);

关于c - server.exe中0x0f6cf9c4的未处理异常:0xC0000005:访问冲突读取位置0x00000001,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40482239/

10-11 21:21