LPWSTR



  • Kann mir jemand erklären, wieso die Größe vom Array so berechnet wird:

    LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" , 
    	L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" , L"R:" , 
    	L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };
    
    	int i = sizeof( LPWSTR );
    	int k = sizeof( drive );
    	uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );
    

    Es liefert den richtigen Wert zurück. Ich kann aber das nicht nachvollziehen.



  • Ein Array kennt seine Größe in Bytes.

    Die Größe eines Arrays geteilt durch die Größe eines Elements ergibt die Anzahl.

    Achtung:
    Ein Array zerfällt schnell zu einem Zeiger. Also nur wenn das Array im Scope vollständig bekannt ist, funktioniert das. Sonst erhälst Du nur die Größe eines Zeigers geteilt durch die Größe eines Zeigers.

    Beispiel:

    int[] array = { 1,2,3,4,5 };
    
    void func(int[] param)
    {
        sizeof(param); // ergibt _NICHT_ 5 * sizeof(int)
    }
    
    int main()
    {
        sizeof(array); // ergibt 5 * sizeof(int);
        func(array);
    }
    


  • wie ich in meinem Fall verstehe:

    ich habe einen 32 bit pointer(LPWSTR) auf jeden Element in Array, insgesamt 26.

    drive =104(26*4)
    size(LPWSTR) = 4

    26 Elemente mit 4 Byte pointer.Richtig so?



  • Es müsste du sizeof(WCHAR) und nicht durch sizeof(LPWSTR) geteilt werden, da die Elemente ja vom Typ WCHAR sind.



  • EDIT: erst denken, dann posten. 🙄



  • also : sizeof(*LPWSTR) gibt mir error C2275 zurück
    sizeof(WCHAR) is die Zeichengröße und ist gleich 2. Aber sizeof(drive)/2 ist nicht gleich 26 der Größe vom Array(sizeof(drive)=104 beim Debuggen)

    Mein Code kompiliert richtig und liefert richtiges ergebnis zurück.
    sizeof(drive) ist bei mir 104
    sizeof(LPWSTR) = 4
    Weil der Pointer 4 Byte groß ist wahrscheinlich. Also 4 * 26 Elemente im Array.



  • Ethon schrieb:

    Es müsste du sizeof(WCHAR) und nicht durch sizeof(LPWSTR) geteilt werden, da die Elemente ja vom Typ WCHAR sind.

    koschka hat Recht, die Elemente sind vom Typ Zeiger auf WCHAR.



  • koschka schrieb:

    Kann mir jemand erklären, wieso die Größe vom Array so berechnet wird:

    LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" ,
    	L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" ,
            L"R:" , L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };
    
    	int i = sizeof( LPWSTR );
    	int k = sizeof( drive );
    	uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );
    

    Es liefert den richtigen Wert zurück. Ich kann aber das nicht nachvollziehen.

    drive ist vom Typ LPWSTR[26], weil Du drive als LPWSTR-Array deklarierst und in der Initialisierungsliste 26 Elemente auftauchen.

    sizeof(LPWSTR) gibt die Größe (in Bytes) eines Objekts vom Typ LPWSTR zurück.

    sizeof(drive) gibt die Größe (in Bytes) eines Objekts vom Typ LPWSTR[26] zurück.

    Ein Array ist eine Aneinanderreihung von einzelnen "Subobjekten" ohne Lücken dazwischen. ==> sizeof(T[N]) = N*sizeof(T)

    sizeof(drive) ist also 26*sizeof(LPWSTR). Und sizeof(LPWSTR) kürzt sich bei der Division raus, so dass 26 übrig bleibt.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ (auch C++0x, bzw. C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Warum nicht einfach:

    std::size_t size = sizeof array / sizeof *array;
    

Log in to reply