Forum: PC-Programmierung Länge Array aus Pointer bestimmen?


von Dirk (Gast)


Lesenswert?

Hallo,

ich möchte in C ein kleines Programm schreiben, dass an eine 
Unterfunktion einen Pointer auf ein Array übergibt. In dieser 
Unterfunktion sollen dann die Daten das gesamten Arrays addiert werden. 
Ich möchte dafür auch in der Unterfunktion die Länge das Arrays 
bestimmen. Allerdings kommt bei der Bestimmung der Pointerlänge immer 
der Wert 4 raus. Kann man nicht die Länge eines Arrays über ainen 
Pointer bestimmen?

Ein Beispiel dazu aus dem Internet:
1
 
2
int main() 
3
{
4
    int days[] = {1,2,3,4,5};
5
    int *ptr = days;
6
    printf("%u\n", sizeof(days));
7
    printf("%u\n", sizeof(ptr));
8
9
    return 0;
10
}

von (prx) A. K. (prx)


Lesenswert?

Dirk schrieb:

> Kann man nicht die Länge eines Arrays über ainen
> Pointer bestimmen?

So wie bei dir nicht, da dein Pointer konzeptionell auf ein einzelnes 
Element zeigt, nicht auf das ganze Array. Daher kriegst du bei 
sizeof(ptr) nur die Grösse des Pointers selbst und bei sizeof(*ptr) die 
Grösse eines Elements.

So hingegen geht es, aber die Information wird hier aus den deklarierten 
Typ des Pointers ermittelt, nicht aus dem Array, und der Pointer verdaut 
nun nur Arrays der Länge 5, was der Sache ihren Sinn nimmt:
1
int main() 
2
{
3
    int days[5] = {1,2,3,4,5};
4
    int (*ptr)[5] = &days;
5
    printf("%u\n", sizeof(days));
6
    printf("%u\n", sizeof(*ptr));
7
8
    return 0;
9
}

In C99 und GCC gibt es Arrays variabler Länge, was hier vielleicht 
besser passen könnte, aber da muss ich vorerst passen.

von A.H. (Gast)


Lesenswert?

Ein guter Hinweis, dass das nicht geht, verdeutlicht ja schon die volle 
Deklaration der main Funktion:
1
int main(int argc, char **argv){
2
}

Daher wird immer sowohl ein Pointer als auch die Anzahl der Elemente 
übergeben. Oder man einigt sich darauf, dass das letzte Element immer 
einen magischen Wert wie NULL hat.

von Detlev T. (detlevt)


Lesenswert?

Leider erzählt mancher dem Programmiernachwuchs auch heute noch den 
Unsinn, Pointer und Arrays wären das gleiche. Und dann kommt halt so 
etwas dabei heraus.

von Dirk (Gast)


Lesenswert?

ok, dann weiß ich bescheid. ann werd ich wohl an die Funktion die Länge 
des Arrays als zusätzlichen Parameter übergeben müssen.

Danke für eure Kommentare

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.