sizeof(), Wie groß sind die einzelnen Arrays etc.



  • Hallo,
    ich schreibe demnächst Klausur in Ansi-C und habe in einer Übung als Teilaufgabe:

    Was geben die printf aus...

    hier mal der Quellcode:
    [cpp]
    #include <stdio.h>

    void fkt1 (int *zgr) {printf("%d\n",sizeof(zgr));}
    void fkt2 (int arr[]) {printf("%d\n",sizeof(arr));}
    void fkt3 (int arr[100]) {printf("%d\n",sizeof(arr));}
    void fkt4 (int mat[100][200]) {printf("%d\n",sizeof(mat));}
    void fkt5 (int (*mat)[200]) {printf("%d\n",sizeof(*mat));}

    int main (void)
    {
    int *ptr, a[100], z[100][200];

    fkt1(ptr);
    fkt2(a);
    fkt3(a);
    fkt4(z);
    fkt5(z);
    return (0);
    }
    [cpp]

    Vorher wurde noch definiert das ein Zeiger 4 Bytes hat.

    Meine Frage ist nun wie ich feststellen kann wieviele Bytes immer verwendet werden.
    Als Lösung kommt ja 4, 4, 4, 4, 800 raus, aber ich kann mir vor allem die letzten Lösungen nicht wirklich erklären. Wie berechnet man denn sowas, bzw auf was muß man aufpassen.
    Vielleicht habt ihr ja noch zusätzlich ein paar tricky sizeof-Operationen die ich mir gleich notieren kann..

    Vielen dank für eure Hilfe!

    Airness



  • Nun, also sizeof auf ein Array angewandt, gibt die größe des Arrays in Bytes an.

    int a[200];
    //Ein int ist also 4 Bytes groß, dann verbraucht ein Array mit 200 ints 800Byte
    
    int (*mat)[200]);
    //Ein Array mit 200 Pointern auf int ist auch 800 byte groß, da ein Pointer(egal auf was) so groß ist wie ein int, nämlich 4 Byte
    

    Aufpassen musst du, wenn du ein Arrayanfang über Pointer übergibst.

    int a[200];
    
    void f(int* p) {} //p ist hier 4 Byte !!!
    f(a);
    
    //Da durch das implizite Casting die Größeninfo des Arrays verloren geht
    


  • Achja, noch ein beliebter Trick:
    Ermitteln der Anzahl der Elemente

    int a[200];
    int anzahl;
    
    anzahl = sizeof(a)/sizeof(int);
    //anzahl ist jetzt 200
    


  • Hi, danke für die schnelle Antwort!
    Aber so ganz schlau bin ich noch nicht geworden, sorry, Anfänger 😕

    Ich hab mir mal rausgeschrieben das

    int mat[10][10] auch int mat[][10] oder int (*mat)[10] das "gleiche" bedeuten.

    müßte dann nicht Fkt 4 und 5 dasselbe ausgeben?

    mit welcher deklaration übergeb ich denn Arrays ansich und mit welcher nur die Zeiger auf Arrays??

    Man sorry, ich stell mich gerade echt dumm an, aber irgendwie versteh ich immer nur Bahnhof.. 😞


Anmelden zum Antworten