2013-07-28 115 views
0

它崩潰與調試錯誤,並說棧周圍的變量「代碼」已損壞。這是我正在做的漢明碼實驗的代碼。輸入文件在同一行上只是一堆1和0。它爲什麼會崩潰?堆棧周圍變量損壞

void processFile(FILE* read, char* InMessage) { 
    int i = 0, count = 0; 

    for (i = 0; !feof(read); i++) { 
      InMessage[i] = fgetc(read); 
     count++; 
    } 

    InMessage[count] = '\0'; 
} 

void hammingCode(char* InMessage) { 
    int len = strlen(InMessage), i = 0, j = 0; 
    char code[12], temp[1000]; 

    temp[0] = '\0'; 

    for (i = 0, j = 0; i < len; i++, j++) { 
     code[j] = InMessage[i]; 
     if (j == 10) { 
      j = 0; 

      decode(code); 
      code[11] = '\0'; 
      strcat_s(temp, sizeof(char)*1000, code); 
     } 
    } 

    strcpy_s(InMessage, sizeof(char)*1000, temp); 
} 

void decode(char* codeWord) { 
    int i = 0, j = 0, parity[4] = {0}, diffParity[4] = {0}, twoPower = 0, readNSkip =  0, bitSum = 0; 

    for (i = 0; i < 4; i++) { 
     twoPower = (int)pow((double)2, i); 

     for (j = twoPower; j <= 12; j++) { 
      if (readNSkip <= twoPower) { 
       if (j != twoPower) { 
        parity[i] += codeWord[j-2] - 48; 
       } 
       readNSkip++; 
      } 
      else { 
       if (readNSkip == twoPower*2) 
        readNSkip = 0; 
       readNSkip++; 
      } 
     } 

     if (parity[i] % 2 == 0) 
      parity[i] = 0; 
     else 
      parity[i] = 1; 

     if ((codeWord[twoPower-1] - 48) != parity[i]) 
      diffParity[i] = 1; 
    } 

    for (i = 0; i < 4; i++) { 
     twoPower = (int)pow((double)2, i); 
     bitSum += diffParity[i]*twoPower; 
    } 

    codeWord[bitSum] = !codeWord[bitSum]; 

} 
+0

在調試器中運行代碼時會發生什麼? –

+0

嘗試gdb ./a.out,然後輸入r並按回車,看看它爲什麼崩潰..並修復它! – lithiumhead

回答

1

有兩個問題,我在這裏看到:

  1. 它看起來像你對我的計算InMessage緩衝區的大小不正確地在您的hammingCode功能:

    int len = strlen(InMessage), i = 0, j = 0; 
    

    strlen函數通過查找第一個空終止符的位置來確定字符串的長度。如果InMessage未被清除,那麼這會給你一些奇怪的長度,因爲它將包含隨機的字節序列。反之,如果您清除了緩衝,然後len爲0。

    爲了克服這個問題,它是更好地爲來電者提供的緩衝區的大小:

    int hammingCode (char *InMessage, size_t messageSize) 
    

    而代替使用messageSizelen

    建議您對其他兩個函數使用相同的策略,以及目前有可能溢出所提供的緩衝區。

  2. 繼上一個問題之後,可能是decode函數寫入緩衝區的邊界之外。提供緩衝區的長度爲decode並添加適當的檢查以確保函數不會超出給定邊界,這將是一個好主意。