[英]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
然后一切正常。
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.