Zum Inhalt springen

Tipp: C wie groß ist der Array?


Empfohlene Beiträge

Geschrieben

Hallo Leute,

wie findet man heraus, wie groß ein Array ist?

Wieviele Element hat wohl der array environ?


int i;

extern char* environ[];


for( i = 0; i++; NULL != environ[i] )


i--;

Das wars. Kein Codeblock für for und i enthält die Anzahl der Element für den array environ.

Geschrieben

sizeof(environ)/sizeof(environ[0])
Wenn du weißt, von welchem Typ (in dem Fall char) der Array ist auch:
sizeof(environ)/sizeof(char)

[Editerle]

Das zweite würd ich bevorzugen, weil wenn nichts im Array drin steht, könnte ein Verweiß auf 0 mitunter zu einem Fehler kommen.

Geschrieben
sizeof(environ)/sizeof(environ[0])
Wenn du weißt, von welchem Typ (in dem Fall char) der Array ist auch:
sizeof(environ)/sizeof(char)

[Editerle]

Das zweite würd ich bevorzugen, weil wenn nichts im Array drin steht, könnte ein Verweiß auf 0 mitunter zu einem Fehler kommen.

Bei erstens muss nicht unbedingt environ[0] existieren und das Prog würde zur Laufzeit SIGSEGV falls environ[0]; nicht alloziert ist.

Bei 2. ist environ ein 2 dimensionales Array. Erst ein character array und dann eine dimension weiter.

Es gibt sicherlich einige Methoden um den Array zu zählen. Welche fällt euch ein?

Geschrieben

Na es kann maximal 65536 Felder haben, da int nicht mehr Zahlen zur Verfügung stellt. Bei unsigned int ginge der Wertebereich von 0 bis 65535 und bei signed int von -32768 bis 32767.

Wie gross es aber wirklich ist, bzw wie viele Werte es enthält, lässt sich anhand der belegten Felder herausfinden. bzw anhand entsprechender Funktionen (siehe die Posts über meinem), die dir die Anzahl ausgibt.

Irgendwie kapier ich die for-Schleife da aber nicht so ganz. Kann das sein, dass die beiden letzten beiden Elemente dadrin vertauscht sind und es eigentlich

for(i=0; environ[i] != NULL; i++)

{

 //mach was

}

heissen sollte.

Was soll das i-- da überhaupt? Das i++ im Kopf der for-schleife und das i-- im Code darunter heben sich doch auf und es würde zu einer Endlosschleife führen, falls da nicht noch etwas anderes steht.

P.S.:

Man prüft normalerweise afaik nicht ab, ob NULL ungleich einem Wert ist, sondern umgekehrt.

Geschrieben
Das wars. Kein Codeblock für for und i enthält die Anzahl der Element für den array environ.
Nein, i enthält die Position des ersten Nullelements in environ. Das ist etwas völlig anderes.

Es gibt sicherlich einige Methoden um den Array zu zählen. Welche fällt euch ein?

Die einzige portable Möglichkeit, die Anzahl der Elemente eines Arrays zu ermitteln, ist sizeof, so wie TDM es gezeigt hat.

Geschrieben

Zwichen for() und i--; war mit Absicht eine Leerzeile, denn diese seperiert for() und schliesst es ohne Block ab.

environ; <- enthält zu guter letzt NULL.

environ[i--]; <- enthält jetzt letztes element

i = Anzahl der Elemente

i-- = letztes Element

So, ich glaube jetzt haben wir es auseinandergezogen?

sizeof() berechnet die Anzahl,

obiger Algorithmus zählt die Anzahl.

Was nun schneller geht und/oder portabler ist wohl von Fall zu Fall unterschiedlich.

;)

Was meint ihr?

Geschrieben
sizeof() berechnet die Anzahl,

obiger Algorithmus zählt die Anzahl.

Nein, dein Algorithmus zählt nicht die Anzahl, sondern sucht das erste Nullelement. In Arrays muss aber gar kein Nullelement vorkommen. Dein Algorithmus funktioniert nur mit Arrays, die mit einer 0 terminiert sind. Das ist aber nicht der Normalfall.


int main()
{
int foo[] = { 3, 4, 5 };

return 0;
}[/code]

"Zähl" hier bitte mal die Elemente von foo.

Geschrieben

ich hab grad mal bisschen rumprobiert:


template <class T, int size>

int f(T (&x)[size])

{

	return size;

}


template <class T, int size, int size2>

int f2(T (&x)[size][size2])

{

	int maxsize = 0;

	for (int i = size; i; i--)

		maxsize += f(x[i]);

	return maxsize;

}


int main(int argc, char* argv[])

{


int na[] = {1,2,3,4};

	std::cout<<f(na)<<std::endl;

	int na2[] = {1,2,3,4,5,6,7};

	std::cout<<f(na2)<<std::endl;

	char ca[] = "test";

	std::cout<<f(ca)<<std::endl;

	int na3[2][3];

	na3[0][0] = 0;

	na3[0][1] = 1;

	na3[0][2] = 2;

	na3[1][0] = 0;

	na3[1][1] = 1;

	na3[1][2] = 2;

	std::cout<<f2(na3)<<std::endl;

	Sleep(3000);

	return 0;

}

Muss sagen, klappt gut. Sogar das Zeichenkettenendekennzeichen hat es beim String mitgezählt.

Geschrieben
Nein, dein Algorithmus zählt nicht die Anzahl, sondern sucht das erste Nullelement. In Arrays muss aber gar kein Nullelement vorkommen. Dein Algorithmus funktioniert nur mit Arrays, die mit einer 0 terminiert sind. Das ist aber nicht der Normalfall.


int main()

{

    int foo[] = { 3, 4, 5 };


    return 0;

}
"Zähl" hier bitte mal die Elemente von foo.
Wie wärs mit:

int foo[] = { 3, 4, 5 };

int i;


for( i = 0; NULL != foo[i]; i++ )


i--;

printf("array first dimension count: %d\n", i);

?

Geschrieben

OT: woher kommt das foo eigentlich?

4711 gibts ja z.b. auch, aber das ist klar ;)

wir könnten ja mal so eine zusammenstellung von namen/ werten erstellen, die im bereich informatik häufig verwendet werden :D

mit hintergrund usw

Geschrieben
OT: woher kommt das foo eigentlich?

4711 gibts ja z.b. auch, aber das ist klar ;)

wir könnten ja mal so eine zusammenstellung von namen/ werten erstellen, die im bereich informatik häufig verwendet werden :D

mit hintergrund usw

foobar geht in die richtung blafasel, bzw. bla und fasel oder blah und fasel.

Geschrieben
Wie wärs mit:


int foo[] = { 3, 4, 5 };
int i;

for( i = 0; NULL != foo[i]; i++ )

i--;
printf("array first dimension count: %d\n", i);
[/CODE]

?

Hast du das mal ausprobiert?

Hier hast du das Semikolon hinter der for-Anweisung weggelassen. So terminiert das nie.

Wenn man das Semikolon wieder reinpackt, bekommt man entweder falsche Werte oder Segfaults bzw. Access Violations. Dieses Programm liefert nur dann den richtigen Wert, wenn zufällig hinter dem Array eine Null im Speicher steht. Und selbst dann wäre es undefiniertes Verhalten.

Geschrieben (bearbeitet)
Na es kann maximal 65536 Felder haben, da int nicht mehr Zahlen zur Verfügung stellt. Bei unsigned int ginge der Wertebereich von 0 bis 65535 und bei signed int von -32768 bis 32767.

Ein 16-Bit System? ;)

Es ist compilerspezifisch, welche die größte Zahl einer int Variablen ist. Gängig sind im heutigen PC Bereich 4 Bytes pro int.

wie findet man heraus, wie groß ein Array ist?

Eine allgemeine Möglichkeit, die Größe eines beliebigen Speicherblocks festzustellen, gibt es nicht.

Der sizeof Operator gibt die Größe des Operanden, bezogen auf ein char, zurück. Die Anzahl der Elemente eines Arrays kann man daraus berechnen. Nur bei char Arrays ist das Ergebnis des Operators gleich der Anzahl der Elemente, sonst nicht!

Man muss aufpassen, wenn man ein Array an eine Funktion übergibt, denn aus Sicht der Funktion ist ein als Parameter übergebenes Array ein Pointer und der sizeof Operator würde nun nicht die Größe des Arrays (bezogen auf ein char), sondern die Größe des Pointers ermitteln.

Bearbeitet von Bubble
Geschrieben
Ein 16-Bit System? ;)

Es ist compilerspezifisch, welche die größte Zahl einer int Variablen ist. Gängig sind im heutigen PC Bereich 4 Bytes pro int.

Da steht Programmierspräche ist C. Und da sollte es denke ich mal darauf begrenzt sein.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...