2012-07-20 51 views
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);爲什麼我的int變量值突然跳躍?

爲什麼?

回答

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

謝謝!這解決了它。計數器和遊標值不再跳躍。 – hannah 2012-07-20 21:27:16

+0

@newbie_hannah,如果將來你看到的值在沒有告訴它們的情況下會發生變化,它幾乎總是超出數組邊界(在這種情況下,'fread'認爲是'JPG_KEY [4]'數組的邊界,而實際上它是'JPG_KEY [1]')。 – Shahbaz 2012-07-20 21:58:48

2

fread(&key, sizeof(JPG_KEY), 4, fp)讀取4 * sizeof(JPG_KEY)字節,如果當然不止你可以存儲在key。用1替換4,一切都應該起作用。

fread(3) manpage

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

函數的fread()中讀取數據的nmemb個元素,每個大小字節長,從流指向流,在由PTR給出的位置中存儲它們。

你的代碼將是正確的,如果你想讀四「JPEG鍵」,也就是說,如果你有JPG_KEY key[4];

爲什麼你的變量跳來跳去是溢出導致你的fread呼叫覆蓋那些其他的原因因爲它們很可能位於堆棧上的key之後。

相關問題