Ich habe einen Code wie folgt:
int i=0;
char a[7]={0x00,0xdc,0x01,0x04};
int len=0;
len = sizeof(a);
printf("The Length is : %d", len);
Hier möchte ich die Länge des Arrays finden a
in c? Wie kann dies geschehen?
Nikhil
Ich habe einen Code wie folgt:
int i=0;
char a[7]={0x00,0xdc,0x01,0x04};
int len=0;
len = sizeof(a);
printf("The Length is : %d", len);
Hier möchte ich die Länge des Arrays finden a
in c? Wie kann dies geschehen?
Jo
Per Konvention sind C-Strings ‘nullterminiert’. Das bedeutet, dass am Ende ein zusätzliches Byte mit dem Wert Null (0x00
). Jede Funktion, die etwas mit einer Zeichenfolge macht (wie z printf
) betrachtet eine Zeichenfolge als beendet, wenn sie null findet. Das bedeutet auch, dass, wenn Ihre Zeichenfolge nicht nullterminiert ist, sie weiterläuft, bis sie ein Nullzeichen findet, was zu einigen interessanten Ergebnissen führen kann!
Da das erste Element in Ihrem Array 0x00 ist, wird es als Länge Null (keine Zeichen) betrachtet.
Wenn Sie Ihre Zeichenfolge wie folgt definiert haben:
char a[7]={0xdc,0x01,0x04,0x00};
zB nullterminiert
dann kannst du verwenden strlen
um die Länge der im Array gespeicherten Zeichenfolge zu messen.
sizeof
misst die Größe einer Schrift. Es ist nicht das, was Sie wollen. Denken Sie auch daran, dass die Zeichenfolge in einem Array kürzer sein kann als die Größe des Arrays.
Die Länge des Arrays beträgt 7
. Null ist die Länge der Zeichenfolge, die im Array gespeichert wird.
– MM
4. September 2014 um 10:19 Uhr
Ich denke, es ist klar, dass er die Länge der Saite wissen möchte nicht das Array, da er weiß, dass die Länge des Arrays 7 ist (siehe seine Frage + Kommentare) und dies für “falsch” hält. Ich habe vorsichtig gesagt, dass strlen die Länge der Zeichenfolge angibt, aber ich habe eine Klarstellung hinzugefügt. Ich denke, die Frage ergibt sich aus der Tatsache, dass er die Länge der Zeichenfolge wissen möchte, aber verwirrt ist (daher der Fragentitel), weil sie nicht gleich der Länge des Arrays ist.
– Jo
4. September 2014 um 11:27 Uhr
sizeof
gibt die Größe des Variablentyps in Bytes zurück. In Ihrem Fall gibt es also die Größe Ihrer zurück char[7]
welches ist 7 * sizeof(char)
. Seit sizeof(char) = 1
das Ergebnis ist 7.
Erweitern Sie dies auf ein weiteres Beispiel:
int intArr[5];
printf("sizeof(intArr)=%u", sizeof(intArr));
ergäbe 5 * sizeof(int)
also würden Sie das Ergebnis “20” erhalten (zumindest auf einer regulären 32-Bit-Plattform. Auf anderen sizeof(int)
kann abweichen)
Um auf dein Problem zurückzukommen:
Es scheint, dass Sie die Länge der Zeichenfolge wissen möchten, die in Ihrem Array enthalten ist, und nicht die Gesamtgröße des Arrays.
Per Definition müssen C-Strings mit einem nachgestellten ‘\0’ (0-Byte) abgeschlossen werden. Um also die passende Länge des in Ihrem Array enthaltenen Strings zu erhalten, müssen Sie den String zuerst beenden, damit Sie wissen, wann er fertig ist. Sonst gäbe es jetzt Weg zu wissen.
Alle Standardfunktionen bauen auf dieser Definition auf, also wenn Sie anrufen strlen
um die abzurufen Str ing len gth durchläuft es das angegebene Array, bis es das erste 0-Byte findet, was in Ihrem Fall das allererste Element wäre.
Eine andere Sache, die Sie möglicherweise nur wissen müssen, weil Sie die verbleibenden Elemente Ihrer nicht ausfüllen char[7]
mit einem Wert enthalten sie tatsächlich zufällige undefinierte Werte.
Hoffe das hat geholfen.
Wenn Sie erwarten 4
als Ausgabe versuchen Sie dann Folgendes:
verkohlen a[]={0x00,0xdc,0x01,0x04};
Sie können dies versuchen:
char tab[7]={'a','b','t','u','a','y','t'};
printf("%d\n",sizeof(tab)/sizeof(tab[0]));
Du kannst tun len = sizeof(a)/sizeof(*a)
für jede Art von Array. Aber Sie haben es als initialisiert a[7] = {...}
was bedeutet, dass seine Länge 7 ist …
sizeof(a)
gibt Ihnen die Größe des Zeigers, nicht des Arrays.
– Oleg Waskewitsch
4. Dezember 2012 um 1:38 Uhr
Ich denke, es gibt Ihnen in diesem Fall die Größe des Arrays. Wenn das Array mit new erstellt wurde, gibt es Ihnen die Größe des Zeigers
– Mayank
9. Januar 2013 um 10:02 Uhr
Ja, ich weiß nicht, warum ich meinen vorherigen Kommentar geschrieben habe. 🙂
– Oleg Waskewitsch
4. September 2014 um 14:02 Uhr
IT_Tau
Wenn jemand nach einer schnellen Lösung dafür sucht, hier ist, wie Sie es tun.
while (array[i] != '\0') i++;
Die Variable ich enthält die verwendete Länge des Arrays, nicht das gesamte initialisierte Array. Ich weiß, es ist ein später Beitrag, aber vielleicht hilft es jemandem.
sizeof(a)
gibt Ihnen die Größe des Zeigers, nicht des Arrays.
– Oleg Waskewitsch
4. Dezember 2012 um 1:38 Uhr
Ich denke, es gibt Ihnen in diesem Fall die Größe des Arrays. Wenn das Array mit new erstellt wurde, gibt es Ihnen die Größe des Zeigers
– Mayank
9. Januar 2013 um 10:02 Uhr
Ja, ich weiß nicht, warum ich meinen vorherigen Kommentar geschrieben habe. 🙂
– Oleg Waskewitsch
4. September 2014 um 14:02 Uhr
Gibt Ihr Code irgendwelche Fehler zurück?
– Sai Kalyan Kumar Akshinthala
27. Mai 2011 um 9:24 Uhr
NEIN, es wird nur 7 als Antwort angezeigt.
– Nikhil
27. Mai 2011 um 9:25 Uhr
Ich denke, Sie wollen strlen(), aber weil Ihr erstes Zeichen 0 ist, erhalten Sie 0.
– ColWhi
27. Mai 2011 um 9:26 Uhr
Sie haben Ihr Array als deklariert
a[7]
also würde sizeof offensichtlich 7 zurückgeben.– Naveen
27. Mai 2011 um 9:28 Uhr
ja, benutze nicht sizeof, sondern debugge es ab 1 val, u’ll c leere Werte nach 4
– MLS
27. Mai 2011 um 9:32 Uhr