2017-10-05 35 views
0

我讀一些代碼,mmap SA文件,返回的值賦給一個指向struct從文件加載C結構

struct cache_header { 
    unsigned int signature; 
    unsigned int version; 
    unsigned int entries; 
    unsigned char sha1[20]; 
}; 

struct cache_header *hdr; 
map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); 
hdr = map; 

後來碼verifies從文件加載結構,這是一部分,我不明白:

SHA_CTX c; 
    unsigned char sha1[20]; 
    if (hdr->signature != CACHE_SIGNATURE) 
     return error("bad signature"); 
    if (hdr->version != 1) 
     return error("bad version"); 
    SHA1_Init(&c); 
    SHA1_Update(&c, hdr, offsetof(struct cache_header, sha1)); 
    SHA1_Update(&c, hdr+1, size - sizeof(*hdr)); 
    SHA1_Final(sha1, &c); 
    if (memcmp(sha1, hdr->sha1, 20)) 
     return error("bad header sha1"); 
    return 0; 

你能解釋爲什麼:

1.there的hdr+1在第二次調用SHA1_Update

2.在對memcmp的調用中,hdr->sha1是一個指針,它的值是無效的,因爲剛剛從磁盤讀取結構,並且它是由另一個代碼庫程序編寫的。

注:size是文件

+0

「hdr-> sha1」實際上不是數組嗎?關於'hdr + 1',它只是創建一個指向下一個'struct cache_header'的指針。也許這個文件有幾個? –

+1

'hdr-> sha1'是一個*數組*,不是一個指針。它可以*衰減*到指向它的第一個元素的指針,但它本身不是指針。 –

+1

至於第一個問題,你必須給我們更多的上下文。更具體地說,請告訴我們「尺寸」是什麼,以及它是如何初始化的。 –

回答

2
  1. 的大小可能是該文件大到足以容納該結構的兩個實例? size的值是多少?不是,hdr->sha1不是指針,而是數組。該數組是struct的一部分,並且hdr->sha1的計算結果爲第一個元素的地址。沒有指針存儲在那裏。

另外請注意,這是不好的做法,因爲你依靠structs包裝(沒有填充),如果沒有確定。

+0

不是C中的數組名稱,只是指向數組的第一個元素的指針? – saga

+0

@saga不,絕對不是。它*有時評估*,但它不是一回事。查看[這個問題](https://stackoverflow.com/questions/1641957/is-an-array-name-a-pointer)瞭解更多。 – unwind