// 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(&amp; key,sizeof(JPG_KEY),4,fp);
为什么?
答案 0 :(得分: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);
答案 1 :(得分:2)
fread(&key, sizeof(JPG_KEY), 4, fp)
读取4 * sizeof(JPG_KEY)
个字节,当然比key
中存储的更多。将4
替换为1
,一切都应该有效。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数fread()从stream指向的流中读取数据的nmemb元素,每个字符长度为字节,将它们存储在ptr给出的位置。
如果您想阅读四个“jpeg密钥”,即如果您有JPG_KEY key[4];
您的变量跳转的原因是溢出导致您的fread
调用覆盖其他变量,因为它们很可能位于堆栈上的key
之后。