Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C (C89 und C99) ::  Länge eines Arrays  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
whitespaces
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.08.2010
Beiträge: 39
Beitrag whitespaces Mitglied 18:21:43 31.08.2010   Titel:   Länge eines Arrays            Zitieren

Hallo,

wie kann ich die Länge eine Arrays festellen?

Also die Länge von so etwas hier:
C/C++ Code:
char array[32] = ""; /* Wie Länge 32 rausbekommen? */
char array[] = {12,45,43,23,67}; /* Wie Länge 5 rausbekommen? */
C/C++ Code:
char array[32] = ""; /* Wie Länge 32 rausbekommen? */
char array[] = {12,45,43,23,67}; /* Wie Länge 5 rausbekommen? */
C/C++ Code:
char array[32] = ""; /* Wie Länge 32 rausbekommen? */
char array[] = {12,45,43,23,67}; /* Wie Länge 5 rausbekommen? */
Sqwan
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.01.2006
Beiträge: 965
Beitrag Sqwan Mitglied 18:48:31 31.08.2010   Titel:              Zitieren

C/C++ Code:
sizeof()
C/C++ Code:
sizeof()
C/C++ Code:
sizeof()
sollte gehen
ggf auch:
C/C++ Code:
sizeof(array) / sizeof(char)
C/C++ Code:
sizeof(array) / sizeof(char)
C/C++ Code:
sizeof(array) / sizeof(char)


EDIT:
Kleine recherche bei google:
strlen() soll für char-arrays funktionieren...

_________________
"Besser" impliziert "Anders" aber "Anders" impliziert noch lange nicht "Besser"
Die alte Kuh so schnell vergisst, dass sie selbst mal Kalb gewesen ist!


Zuletzt bearbeitet von Sqwan am 18:50:25 31.08.2010, insgesamt 2-mal bearbeitet
rage_quit
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.07.2010
Beiträge: 245
Beitrag rage_quit Mitglied 19:29:38 31.08.2010   Titel:              Zitieren

Sqwan schrieb:
C/C++ Code:
sizeof()
C/C++ Code:
sizeof()
C/C++ Code:
sizeof()
sollte gehen
ggf auch:
C/C++ Code:
sizeof(array) / sizeof(char)
C/C++ Code:
sizeof(array) / sizeof(char)
C/C++ Code:
sizeof(array) / sizeof(char)


EDIT:
Kleine recherche bei google:
strlen() soll für char-arrays funktionieren...


besser wär
C/C++ Code:
(sizeof(array) / sizeof(array[0]))
C/C++ Code:
(sizeof(array) / sizeof(array[0]))
C/C++ Code:
(sizeof(array) / sizeof(array[0]))
falls das überhaupt klappt ;)

_________________
People who ragequit often do so because they believe that their team has no chance of success
whitespaces
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.08.2010
Beiträge: 39
Beitrag whitespaces Mitglied 19:49:28 31.08.2010   Titel:              Zitieren

Danke, ja das zweite mit dem ersten Element als Divisor gefällt mir noch besser da ich hier unabhängig vom typ bin. strlen war mir bekannt funktioniert aber nur bei 0 terminierten Strings und das hätte bei dem Beispiel falsche Werte gebracht.
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 12055
Beitrag SeppJ Moderator 20:08:23 31.08.2010   Titel:              Zitieren

Da ich die nächste Frage erraten kann, beantworte ich sie schon einmal:
Nein, das funktioniert, wenn man nur einen Zeiger auf ein Array hat (zum Beispiel nach Übergabe an eine Funktion). In diesem Fall würde man bloß die Länge eines Zeigertyps erhalten (gewöhnlich 4 oder 8).
nachfrager
Unregistrierter




Beitrag nachfrager Unregistrierter 20:18:04 31.08.2010   Titel:              Zitieren

@SeppJ du meintest die größe des arrays muß zu compilezeit feststehen? da sonst sizeof nicht klappt? hab das iwie noch nicht so ganz verstanden :(
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 22629
Beitrag rüdiger Moderator 20:34:21 31.08.2010   Titel:              Zitieren

nachfrager schrieb:
@SeppJ du meintest die größe des arrays muß zu compilezeit feststehen? da sonst sizeof nicht klappt? hab das iwie noch nicht so ganz verstanden :(


Nein, die Größe muss zur Compilezeit nicht feststehen (C99 VLAs gehen mit sizeof auch). Man muss eben nur beachten, dass man hier einen der wenigen Fälle hat, wo eine Unterscheidung zwischen Array und Pointer eine Rolle spielt. In C wird das ja sonst nicht so eng genommen.
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 12055
Beitrag SeppJ Moderator 20:41:59 31.08.2010   Titel:              Zitieren

nachfrager schrieb:
@SeppJ du meintest die größe des arrays muß zu compilezeit feststehen? da sonst sizeof nicht klappt? hab das iwie noch nicht so ganz verstanden :(
Komplett anderes Thema, klare Antwort: Jain. :D

Erstmal hat das Funktionieren von sizeof nichts damit zu tun. sizeof liefert die Größe der Variablen. Wirft man sizeof ein Array vor, bekommt man die Größe des Arrays, nimmt man einen Zeiger, bekommt man die Größe des Zeigers, ganz einfach. Worauf ich hinaus wollte ist, dass man öfters mal Konstrukte hat wie
C/C++ Code:
void foo(int *bar);

// ...

int beispiel[5];
foo(beispiel);
C/C++ Code:
void foo(int *bar);

// ...

int beispiel[5];
foo(beispiel);
C/C++ Code:
void foo(int *bar);

// ...

int beispiel[5];
foo(beispiel);
Dann könnte foo() nicht feststellen, dass das übergebene Array 5 Elemente hat, weil sizeof ja bloß die Größe des Zeigers bar liefern würde.

Nun zu der Frage ob Arraygrößen zur Compilezeit feststehen müssen:
Zunächst einmal Nein, denn man kann immer mit malloc Arrays beliebiger (zur Compilezeit unbekannter) Größe anlegen*. Dann aber auch wieder ja, denn wenn man nicht mit malloc arbeitet (also zum Beispiel int beispiel[5];) dann muss die Größe, hier 5, zur Compilezeit feststehen.
Man sollte auch sagen, dass einige Compiler (zum Beispiel GCC) bei letzterem auch Werte akzeptieren die zur Compilezeit noch nicht bekannt sind. Dies sind aber nicht standardisierte Compilererweiterungen. Deshalb lieber nicht in wichtigem Code benutzen. Ist aber ganz praktisch für schnell zusammengeschriebene Testprogramme.



*: Ganz genau genommen hat man dann aber bloß einen Zeiger auf einen Speicherbereich, den man wie ein Array benutzt, kein Array im Sinne des Typensystems. Entsprechend kann man auch hier im Nachhinein nicht mittels sizeof feststellen, wie groß der Speicherbereich ist, man bekommt nur die Größe des Zeigers.


Zuletzt bearbeitet von SeppJ am 20:45:49 31.08.2010, insgesamt 1-mal bearbeitet
Sqwan
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.01.2006
Beiträge: 965
Beitrag Sqwan Mitglied 20:46:14 31.08.2010   Titel:              Zitieren

erklärs doch noch komplizierter...

Wenn man ein array an eine funktion übergibt, wird nur ein Zeiger auf das array übergeben. Und wenn man die größe mit sizeof() nun bestimmt wird die größe des Zeigers in Byte zurück gegeben. Bei mir sinds 4Byte...
Also 32 bit. Eigentlich nur eine Zahl die angibt an welcher stelle im speicher der erste wert beginnt.

EDIT: Bezog sich auf rüdigers beitrag. hast es gut erklärt ^^
EDIT2: Ist c++ weil ich keinen reinen c-kompiler habe... bzw ich weiß nicht obs in c auch ginge. Ist vllt auch nicht schön, aber bei mir funktionierts so auch:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdlib>
#include
<iostream>

using namespace std;

void test(char a[])
{
     printf("%i\n", sizeof(a));
}
int main(int argc, char *argv[])
{
    char arrays[32] = "";
    printf("%i\n", sizeof(arrays));
    test(arrays);
    system("PAUSE");
    return EXIT_SUCCESS;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdlib>
#include
<iostream>

using namespace std;

void test(char a[])
{
printf("%i\n", sizeof(a));
}
int main(int argc, char *argv[])
{
char arrays[32] = "";
printf("%i\n", sizeof(arrays));
test(arrays);
system("PAUSE");
return EXIT_SUCCESS;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdlib>
#include
<iostream>

using namespace std;

void test(char a[])
{
     printf("%i\n", sizeof(a));
}
int main(int argc, char *argv[])
{
    char arrays[32] = "";
    printf("%i\n", sizeof(arrays));
    test(arrays);
    system("PAUSE");
    return EXIT_SUCCESS;
}


reicht ja wenn ihr die funktion betrachtet. ergebnis ist 32 und 4

_________________
"Besser" impliziert "Anders" aber "Anders" impliziert noch lange nicht "Besser"
Die alte Kuh so schnell vergisst, dass sie selbst mal Kalb gewesen ist!


Zuletzt bearbeitet von Sqwan am 20:54:56 31.08.2010, insgesamt 2-mal bearbeitet
whitespaces
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.08.2010
Beiträge: 39
Beitrag whitespaces Mitglied 07:07:18 01.09.2010   Titel:              Zitieren

Hmm schade das sizeof nach der Übergabe an eine Funktion nicht mehr klappt. Ich hatte nämlich vor in meiner Funktion erstmal zu überprüfen ob die Parameter ausreichend dimensioniert sind damit meine Funktion kein undefiniertes Verhalten erzeugt.

Wie löse ich sowas dann? Ich möchte ein char* str prüfen ob darin z.B. 32 Zeichen Platz hätten. Muss ich dann die Länge vorher mit sizeof bestimmen und dann als zusätzlichen Parameter mit übergeben oder wie lösen die Profis sowas?

Macht es einen Unterschied ob ich char* str übergebe oder char atr[] ?
C/C++ Forum :: C (C89 und C99) ::  Länge eines Arrays  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.