我无法在此代码中找到错误,我看了几个小时...... Valgrind说:
==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 :(得分:0)
== 23114 ==读取大小为1的无效 == 23114 ==写入大小为1的无效
我很确定不是所有 valgrind说的。
你应该
-g
标志)。这将让valgrind告诉你完全哪一行触发了无效的读写valgrind --track-origins=yes your-exe
可能会提供其他有用信息。最后,您的算法出现完全是假的。据我所知,j
在第一个while
循环后变为3,并且在此之后永远不会更改(在这种情况下,您应该只使用const int j = 3;
并取消j++
})。另外,您引用img[j + p]
,其中p
介于0
和n
之间。如果n
确实是img
的大小,那么j + p
超出img
限制的索引就不足为奇了,并且会触发这两个错误。