2016-11-08 58 views
0

這裏是我在Visual Studio 2008中編寫的代碼。我使用該數據獲取數據在接收數組&中,我正在準備對它做出響應。但是我得到錯誤「server.exe中的0x0f6cf9c4未處理的異常:0xC0000005:訪問衝突讀取位置0x00000001。」代碼運行時每次都在「strcat」函數中。server.exe中的0x0f6cf9c4未處理的異常:0xC0000005:訪問衝突讀取位置0x00000001

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]); 
+2

與您的問題無關,但不能使用'=='比較字符串。用'=='比較*指針*,而不是指向它們,因此它永遠不會是真的。使用['strcmp'](http://en.cppreference.com/w/c/string/byte/strcmp)比較字符串。 –

+0

至於你的問題,首先在調試器中運行你的程序來捕捉「實際中」的崩潰。通過這種方式,您可以找到代碼中發生的位置,並檢查變量及其值,以確保它們看起來很好。至少請編輯您的問題,告訴我們發生崩潰的位置以及相關變量的值。 –

回答

0

你不能strcat(s, result[index]);因爲沒有記憶alocated到s舉辦串接給它的額外的數據,s具有固定大小..

而且,由於可能是代碼的函數裏面, unsigned char result[50];是本地的,未初始化爲零。因此它不是字符串,並且strcant可能會失敗。

同樣適用於int i;它的值是不確定的,所以Receive[i+1]可能會失敗。

修復程序unsigned char result[50] = 0;int i=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]); 
0

問題似乎與聲明

的char * s =「FF ff ff 1d 00 01 01 0b 00 01「;

該聲明會將值放在內存的只讀部分,並且使指向該內存的任何寫入操作非法的指針。

當你在做 strcat(s,result [index]);

您正嘗試在內存的只讀部分寫入,這反過來給你例外。您應該爲s分配足夠的內存,然後對其執行字符串操作。

0

除了試圖串連成一個常量字符串(這將使您的訪問衝突從零遠遠不同的位置),你的錯誤的來源很可能是你傳遞字符作爲第二個參數到strcat(),而不是指針。如果您沒有收到編譯器提供的警告,則表示您的編譯器設置錯誤。

如果您確實收到警告但忽略它們,則表示您的頭部設置不良。

相關問題