0
// a cursor variable, for positioning purposes
int cursor = 0;

// declare a counter
int counter = 0;

// start a loop
while (counter <= 0)
{
    // get the cursor positioned correctly
    fseek(fp, cursor, SEEK_SET);

    // read the file and search for the jpeg key
    JPG_KEY key;
    fread(&key, sizeof(JPG_KEY), 4, fp);

    // check the key to see if you are at the start of a jpeg
    if( check_jpg_key(key) )
        counter++;

    cursor++;
}

出于某种原因,我的“光标”和“计数器”变量在该程序中间跳转到高得离谱的整数,而不是在每个循环中递增 1。使用gdb,我发现在这一行光标的值从0跳转到2099202,计数器的值从0跳转到3419700: fread(&key, sizeof(JPG_KEY), 4, fp);

为什么?

4

2 回答 2

5
fread(&key, sizeof(JPG_KEY), 4, fp);

您正在读取sizeof(JPG_KEY) * 4字节,从地址&key开始存储它们。由于key只有一个足够的空间sizeof(JPG_KEY),因此您正在覆盖堆栈中的其他变量。

fread的签名是:

size_t fread(void *ptr, size_t  size,  size_t  nitems,  FILE *stream);

也就是说,如果你只想阅读 1 JPG_KEY,你应该写:

fread(&key, sizeof(JPG_KEY), 1, fp);
于 2012-07-20T21:24:08.080 回答
2

fread(&key, sizeof(JPG_KEY), 4, fp)读取4 * sizeof(JPG_KEY)的字节数当然超过了您可以存储的字节数key4用 a替换1,一切都应该工作。

fread(3)手册页

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

函数 fread() 从 stream 指向的流中读取数据的 nmemb 元素,每个 size 字节长,并将它们存储在 ptr 给定的位置。

如果您想阅读四个“jpeg 密钥”,您的代码将是正确的,即如果您有JPG_KEY key[4];

你的变量跳来跳去的原因是溢出导致你的fread调用覆盖那些其他变量,因为它们很可能位于key堆栈的后面。

于 2012-07-20T21:24:11.060 回答