Seite 1 von 1

[gelöst] sizeof-Operator und Feld an Funktion übergeben

Verfasst: 9. September 2008 04:23
von gelignite
Hallo,

ich stehe gerade auf dem Schlauch. Ich muss, als der Stoff behandelt wurde, krank gewesen sein. Ich habe folgendes Problem, zu dem mir keine Erklärung einfällt:

Code: Alles auswählen

#include <stdio.h>

void anzahlFeldelemente( int * feld )
{
                int * lokalesFeld = feld;
                printf( "\nAnzahl Elemente im Feld: %d\n", sizeof( lokalesFeld ) / sizeof( lokalesFeld[0] ));                 /* Ausgabe: 1, für mich falsch */
                printf( "\nlokalesFeld[ 5 ]: %d\n", lokalesFeld[ 5 ] );                                                                                /* Ausgabe: 5 */
}

int main( void )
{
                int einFeld[ 10 ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                printf( "\nAnzahl Elemente im Feld: %d\n", sizeof( einFeld ) / sizeof( einFeld[0] ));                                 /* Ausgabe: 10, korrekt */
                anzahlFeldelemente( einFeld );

                return 0;
}
In der Funktion habe ich dann probehalber auch das probiert, mit entsprechendem Ergebnis:

Code: Alles auswählen

                printf( "\nAnzahl Elemente im Feld: %d\n", sizeof( *lokalesFeld ) / sizeof( lokalesFeld[0] ));                /* Ausgabe: 1 */
                printf( "\nAnzahl Elemente im Feld: %d\n", sizeof( feld ) / sizeof( feld[0] ));                                           /* Ausgabe 1 */
                printf( "\nAnzahl Elemente im Feld: %d\n", sizeof( *feld ) / sizeof( feld[0] ));                                          /* Ausgabe: 1 */
Sizeof() liefert in der Funktion einen für mich nicht nachvollziehbaren Wert. Auf das Feld zugreifen kann ich, wie das Beispiel zeigt, aber die Anzahl der Elemente ermitteln nicht? Das geht mir nicht in den Kopf. Was übersehe ich?

Gruß,
gelignite

Verfasst: 9. September 2008 06:30
von Christian81
Da "int *" ein Pointer ist wird sizeof() 4 oder 8 zurückgeben. Der Compiler kann an dieser Stelle nicht wissen was hinter dem Pointer steckt.

Verfasst: 9. September 2008 13:53
von gelignite
Hallo,

Ich habe jetzt mal probehalber das Feld dynamisch angelegt via:

Code: Alles auswählen

int * einFeld = new int [ 10 ];
Da bekomme ich dann auch nur noch 1 als Ausgabe. (Wie nach deiner Aussage erwartet.)

Nachdem ich jetzt weiß wonach ich suchen muss, ist auch eine bekannte Suchmaschine relativ gesprächig. Danke. :-)

Gruß,
gelignite

P.S.: Für andere mit diesem Problem: (Stichwort: "cannot be used")
http://msdn.microsoft.com/en-us/library ... S.71).aspx


Edit: Der Link wird vom Board leider leicht zerschnitten.

Verfasst: 9. September 2008 13:57
von Christian81
C ist in dieser Hinsicht etwas doof - dafür emfpehle ich dann eher c++ std- oder Qt-Containerklassen.