0

私はこのコードでエラーを見つけることができません、私はそれを何時間も見ています...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);
}

手伝ってくれてありがとう!

4

1 に答える 1

0

==23114== サイズ 1 の無効な読み取り ==
23114== サイズ 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]ます。が実際に のサイズである場合、インデックスが制限外であることは驚くに値せず、両方のエラーが発生します。p0nnimgj + pimg

于 2012-07-03T11:06:24.800 に答える