server.exe中0x0f6cf9c4处的未处理异常:0xC0000005:访问冲突读取位置0x00000001

时间:2016-11-08 08:31:32

标签: c

以下是我在visual studio 2008中编写的代码。我在Receive array& amp;使用这些数据,我正准备回应它。但是我收到错误" 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]);

4 个答案:

答案 0 :(得分: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]);

答案 1 :(得分:0)

你不能strcat(s, result[index]);,因为s没有内存用于保存连接到它的额外数据,s具有固定大小..

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

同样适用于int i;它的值是不确定的,因此Receive[i+1]可能会失败。

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

答案 2 :(得分:0)

问题似乎与声明有关

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

此声明将值放在内存的只读部分中,并使s成为指向该内存的任何写入操作的指​​针。

当你做的时候 strcat(s,result [index]);

你试图在内存的只读部分上写,这反过来会给你带来异常。你应该为s分配有用的内存,然后对它进行字符串操作。

答案 3 :(得分:0)

除了尝试连接到一个常量字符串(这会给你一个访问冲突一个远离零的位置),你错误的来源很可能是你的错将单个字符作为第二个参数传递给strcat(),而不是指针。如果你没有从编译器得到至少一个警告响应这样做,这意味着你的编译器设置不当。

如果你确实收到了警告而忽略了它们,那就意味着你的头脑设置得很糟糕。