2013-07-28 119 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并添加适当的检查以确保函数不会超出给定边界,这将是一个好主意。