Länge Array aus Pointer bestimmen?

Gast #1888965
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
}
#1888969
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.
Gast #1888975
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren