为什么我的int变量值会突然跳转?

时间:2012-07-20 21:21:24

标签: c int

// 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);

为什么?

2 个答案:

答案 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,一切都应该有效。

来自fread(3) manpage

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

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

如果您想阅读四个“jpeg密钥”,即如果您有JPG_KEY key[4];

,那么您的代码是正确的

您的变量跳转的原因是溢出导致您的fread调用覆盖其他变量,因为它们很可能位于堆栈上的key之后。