c - Hvordan ved du, at nogle felter i strukturer er arrayer?

Indlæg af Hanne Mølgaard Plasc

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 typedefpointers kun ulemper. Det eneste tilfælde, at typedefpointer 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.