Zum Inhalt springen

Tipp: C wie groß ist der Array?


icefox

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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...