2012-07-02 52 views
0

的无效读我不能找到在这个代码中的错误,林看着它几个小时... Valgrind的说:Valgrind的错误:大小1

==23114== Invalid read of size 1 
==23114== Invalid write of size 1 

我试图调试一些printfs输出,并且我认为错误在这个函数中。

void rdm_hide(char *name, Byte* img, Byte* bits, int msg, int n, int size) 
{ 
    FILE *fp; 
    int r;/ 
    Byte* used; 
    int i = 0, j = 0; 
    int p; 

    fp = fopen(name, "wb"); 

    used = malloc(sizeof(Byte) * msg); 


    for(i = 0; i < msg; i++) 
     used[i] = -1; 


    while(i < 3) 
    { 
     if(img[j] == '\n') 
      i++; 
     j++; 
    } 

    for(i = 0; i < msg; i++) 
    { 
     r = genrand_int32(); 
     p = r % n; 

     if(!search(p, used, msg)) 
     { 
      used[i] = (Byte)p; 

      if(bits[i] == (Byte)0) 
       img[j + p] = img[j + p] & (~1); 
      else if(bits[i] == (Byte)1) 
       img[j + p] = img[j + p] | 1; 
     } 
     else 
      i --; 
    } 

    for(i = 0; i < size; i++) 
     fputc((char) img[i], fp); 

    fclose(fp); 
    free(used); 
} 

感谢您的帮助!

+0

你可以运行valgrind选项** - read-var-info = yes **并共享输出? – tuxuday

+0

当你正在写入和读取img指向的数组时,它可能正在发生。使用gdb来查明它正在发生什么行。 – sj755

回答

0

==23114== Invalid read of size 1
==23114== Invalid write of size 1

我敢肯定,这不是所有的valgrind说。

你应该

  1. 建立与调试信息(最有可能-g标志)程序。这会让valgrind告诉你究竟是哪一行触发无效读写
  2. 如果问题不明显,编辑你的问题,包括整个 valgrind输出。
  3. 重新运行valgrind --track-origins=yes your-exe可能会提供其他有用的信息。

最后,你的算法出现是完全虚假的。据我所知,j在第一个while循环之后变成3,并且在此之后从未改变(在这种情况下,您应该只使用const int j = 3;并废除j++)。此外,您还参考img[j + p],其中p介于0n之间。如果n确实是img的大小,那么限制之外的j + p索引并不意外,并触发这两个错误。