c - Hvordan ved du, at nogle felter i strukturer er arrayer?
Problem
Jeg kigger på dette stykke C-kode fra Microsoft
wincrypt.h
header file//+-------------------------------------------------------------------------
// Attributes
//
// Where the Value's PATTR\_BLOBs are in their encoded representation.
//--------------------------------------------------------------------------
// certenrolls\_begin -- CRYPT\_ATTRIBUTE
typedef struct \_CRYPT\_ATTRIBUTE {
LPSTR pszObjId;
DWORD cValue;
PCRYPT\_ATTR\_BLOB rgValue;
} CRYPT\_ATTRIBUTE, *PCRYPT\_ATTRIBUTE;
typedef struct \_CRYPT\_ATTRIBUTES {
DWORD cAttr;
PCRYPT\_ATTRIBUTE rgAttr;
} CRYPT\_ATTRIBUTES, *PCRYPT\_ATTRIBUTES;
// certenrolls\_end
og jeg kører dette eksempel Sådan får du oplysninger fra Authenticode Signed Executables. Jeg kan se i koden, at både
rgValue
og rgAttr
er tilgængelige som arrayer, fx [21]pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].pbData,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].cbData,
Hvis jeg ikke har set eksemplet, får jeg aldrig det her. Er det noget Windows specifikt eller min totale uvidenhed om struct og type erklæringer i C?
Bedste reference
PCRYPT\_ATTR\_BLOB
er CRYPT\_ATTR\_BLOB*
, peger på CRYPT\_ATTR\_BLOB
. Dette kan enten være en pointer til en enkelt værdi eller en pointer til en matrix. Du kan ikke fortælle fra typeerklæringen og skal læse dokumentationen.Denne dokumentation siger: [22]
cValue
En DWORD -værdi, der angiver antallet af elementer i rgValue
array.
rgValue
Peger på en række CRYPT\_INTEGER\_BLOB strukturer.
Så i dette tilfælde er
rgValue
en pointer til en matrix.Andre referencer 1
rgAttr
og rgValue
er af typen pointer til struct
:typedef struct \_CRYPT\_ATTRIBUTES *PCRYPT\_ATTRIBUTES;
typedef struct \_CRYPT\_ATTRIBUTE *PCRYPT\_ATTRIBUTE;
Nu når du gør
PCRYPT\_ATTRIBUTE rgAttr
, vil det være quivalent til struct \_CRYPT\_ATTRIBUTE *rgAttr
og til CRYPT\_ATTRIBUTE *rgAttr
.Generelt har brug af
typedef
på pointers
kun ulemper. Det eneste tilfælde, at typedef
på pointer
rent faktisk er nyttigt, er, når markøren er en funktionspeger.Andre referencer 2
Bemærk, at MS er temmelig konstant i den ungarske stil navne dekoration, 'rg' prefix fortæller dig det er en matrix selv uden at gå til docs.