簡體   English   中英

為什么我的int變量值突然跳?

[英]Why do my int variable values suddenly jump?

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

為什么?

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

fread(&key, sizeof(JPG_KEY), 4, fp)讀取4 * sizeof(JPG_KEY)個字節,這當然可以存儲在key 4替換為1然后一切正常。

fread(3)聯機幫助頁中

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

函數fread()從stream指向的流中讀取每個長度為字節大小的nmemb數據元素,並將它們存儲在ptr給定的位置。

如果您想讀取四個“ jpeg鍵”,即您有JPG_KEY key[4];則您的代碼是正確的JPG_KEY key[4];

變量跳來跳去的原因是,溢出導致fread調用覆蓋了其他變量,因為它們很可能位於堆棧中的key之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM