Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Tipp: C wie groß ist der Array?

Empfohlene Antworten

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.

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.

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?

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.

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.

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?

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.

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.

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);

?

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

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.

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.

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.