我讀一些代碼,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
是文件
「hdr-> sha1」實際上不是數組嗎?關於'hdr + 1',它只是創建一個指向下一個'struct cache_header'的指針。也許這個文件有幾個? –
'hdr-> sha1'是一個*數組*,不是一個指針。它可以*衰減*到指向它的第一個元素的指針,但它本身不是指針。 –
至於第一個問題,你必須給我們更多的上下文。更具體地說,請告訴我們「尺寸」是什麼,以及它是如何初始化的。 –