Speichergröße bestimmen eines char-arrays mit sizeof



  • hallo, habe folgenden code:

    #include <stdio.h>
    
    int main(void)
    {
    	int iarr[] = {2,4,6,4,2,4,5,6,7};
    	double darr[] = {3.3, 4.4, 2.3, 5.8, 7.7};
    	char str[] = {"Hallo Welt!"};
    
    	int size1 = sizeof (iarr);
    	double size2 = sizeof(darr);
    	char size3 = sizeof (str); 
    
    	printf("%d\n", size1);
    	printf("%f\n", size2);
    	printf("%c\n", size3);
    
    }
    

    als ausgabe kommt:

    36
    40.000000

    raus.

    die 36 steht für die byte-größe des int arrays. Ich nehme an die 40.000000 steht für die byte-größe des double arrays. aber wieso wird die größe des char-arrays nicht angegeben?

    kann mir das jmd. vtl. sagen?



  • sizeof gibt doch keine double und char Werte zurueck.

    #include <stdio.h> 
    
    int main(void) 
    { 
        int iarr[] = {2,4,6,4,2,4,5,6,7}; 
        double darr[] = {3.3, 4.4, 2.3, 5.8, 7.7}; 
        char str[] = {"Hallo Welt!"}; 
    
        int size1 =	sizeof(iarr); 
        int size2 = sizeof(darr); 
    	int size3 = sizeof(str);
    
        printf("%d\n", size1); 
        printf("%d\n", size2);
    	printf("%d\n", size3);
    }
    

    * Am besten gleich size1, size2 und size3 weglassen und direkt sizeof(...) in printf einsetzen.



  • @icarus2
    sizeof gibt size_t zurück, nicht int. 😉



  • cooky451 schrieb:

    @icarus2
    sizeof gibt size_t zurück, nicht int. 😉

    Das hatte ich befuerchtet. War mir aber nicht mehr ganz sicher und hatte keine Lust es nachzuschauen 😃
    Danke fuer den Hinweis.



  • cooky451 schrieb:

    @icarus2
    sizeof gibt size_t zurück, nicht int. 😉

    Wie lautet der Formatspezifizierer für size_t, der in printf gebraucht wird?



  • Ich hab das einfach immer in ein unsigned long gecastet und dann mit printf ausgegeben.
    Kann dir aber nicht sagen, ob das eine saubere Lösung ist...



  • Ich habe mich kurz im Internet umgeschaut und so muesste es fuer C99 funktionieren:

    #include <stdio.h> 
    
    int main(void) 
    { 
        int iarr[] = {2,4,6,4,2,4,5,6,7}; 
        double darr[] = {3.3, 4.4, 2.3, 5.8, 7.7}; 
        char str[] = {"Hallo Welt!"}; 
    
        size_t size1 = sizeof(iarr); 
        size_t size2 = sizeof(darr); 
        size_t size3 = sizeof(str);
    
        printf("%zu\n", size1); 
        printf("%zu\n", size2);
        printf("%zu\n", size3);
    }
    

    C89 kennt "%zu\n" allerdings nicht. Wenn man also Rueckwaertskompatibilitaet zu C89 moechte oder gleich mit C89 arbeitet kommt man wahrscheinlich nicht drum herum mit Macros zu arbeiten.



  • icarus2 schrieb:

    C89 kennt "%zu\n" allerdings nicht. Wenn man also Rueckwaertskompatibilitaet zu C89 moechte oder gleich mit C89 arbeitet kommt man wahrscheinlich nicht drum herum mit Macros zu arbeiten.

    Was soll denn so ein Makroschrott hier bringen? Nichts, nur Unübersichtlichkeit.



  • Wutz schrieb:

    icarus2 schrieb:

    C89 kennt "%zu\n" allerdings nicht. Wenn man also Rueckwaertskompatibilitaet zu C89 moechte oder gleich mit C89 arbeitet kommt man wahrscheinlich nicht drum herum mit Macros zu arbeiten.

    Was soll denn so ein Makroschrott hier bringen? Nichts, nur Unübersichtlichkeit.

    Auf Stackoverflow wurde folgendes vorgeschlagen:

    #if defined(_MSC_VER)
      #define JL_SIZE_T_SPECIFIER    "%Iu"
      #define JL_SSIZE_T_SPECIFIER   "%Id"
      #define JL_PTRDIFF_T_SPECIFIER "%Id"
    #elif defined(__GNUC__)
      #define JL_SIZE_T_SPECIFIER    "%zu"
      #define JL_SSIZE_T_SPECIFIER   "%zd"
      #define JL_PTRDIFF_T_SPECIFIER "%zd"
    #else
      // TODO figure out which to use.
      #if NUMBITS == 32
        #define JL_SIZE_T_SPECIFIER    something_unsigned
        #define JL_SSIZE_T_SPECIFIER   something_signed
        #define JL_PTRDIFF_T_SPECIFIER something_signed
      #else
        #define JL_SIZE_T_SPECIFIER    something_bigger_unsigned
        #define JL_SSIZE_T_SPECIFIER   something_bigger_signed
        #define JL_PTRDIFF_T_SPECIFIER something-bigger_signed
      #endif
    #endif
    

    Ich nehme an du findest das keine gute Loesung. Wie wuerde denn eine bessere Loesung des Problems aussehen?



  • Auf den größten integralen unsigned Typ casten und fertig. Funktioniert immer im Gegensatz zu den Makros mit ihren ifdefs.



  • Ich dachte immer, size_t sei ein typedef für unsigned long.



  • Wutz schrieb:

    Auf den größten integralen unsigned Typ casten und fertig. Funktioniert immer im Gegensatz zu den Makros mit ihren ifdefs.

    Ist auch nicht besonders schoen aber zugegeben: Viel schoener als die Macros 🙂


  • Mod

    Bonni4355 schrieb:

    Ich dachte immer, size_t sei ein typedef für unsigned long.

    Meistens. Aber nicht unbedingt.


Anmelden zum Antworten