#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[] = "october"; // 7 letters
strcpy(string, "september"); // 9 letters
printf("the size of %s is %d and the length is %d\n\n", string,
sizeof(string), strlen(string));
return 0;
}
Ausgabe:
$ ./a.out
the size of september is 8 and the length is 9
Stimmt etwas mit meiner Syntax nicht oder was?
Sie schreiben über das Ende des Arrays hinaus string. Dies ist ein undefiniertes Verhalten. string kann nur 8 Zeichen enthalten (7 für “Oktober” und 1 für das Null-Terminator). Wenn du anrufst strcpyschreiben Sie 10 Zeichen hinein (9 für “september” und 1 für das Null-Terminator), was bedeutet, dass Sie das Ende des Arrays überschritten haben und den angrenzenden Speicher überschreiben.
– Marlon
30. März 2012 um 4:55 Uhr
Beachten Sie, dass sizeof berechnet wird kompilieren Zeit wo als strlen ist Laufzeit.
– Naveen
30. März 2012 um 4:57 Uhr
@Naveen: Beachten Sie, dass dies nicht unbedingt zutrifft, wenn VLAs beteiligt sind.
– Café
30. März 2012 um 5:31 Uhr
@caf: Vielleicht fühle ich mich ahnungslos, aber … Was meinst du mit VLAs? Sehr große Arrays? lol
– Cory Gross
7. August 2013 um 6:41 Uhr
Ich sage das in der Funktion int foo(int n) { int a[n]; der Wert sizeof a wird zur Kompilierzeit nicht berechnet.
– Café
7. August 2013 um 7:49 Uhr
Sean
sizeof und strlen() verschiedene Sachen machen. In diesem Fall Ihre Erklärung
char string[] = "october";
ist das gleiche wie
char string[8] = "october";
damit der Compiler die Größe von erkennen kann string ist 8. Dies geschieht zur Kompilierzeit.
Jedoch, strlen() zählt die Anzahl der Zeichen in der Zeichenfolge zur Laufzeit. Also, nachdem Sie angerufen haben strcpy(), string enthält jetzt “september”. strlen() zählt die Zeichen und findet 9 davon. Beachten Sie, dass Sie nicht genügend Speicherplatz zugewiesen haben string “September” zu halten. Dies ist ein undefiniertes Verhalten.
Ja, selbst nach dem Kopieren von “September” gibt es immer noch die korrekte Länge der Zeichenfolge an, obwohl wir nicht wissen, dass die 9. Position ein Nullzeichen enthält oder nicht!
– Dr. Essen
20. März 2018 um 14:26 Uhr
Praveen.thota
Die Ausgabe ist korrekt, weil
Die Größe der ersten Anweisungszeichenfolge wurde vom Compiler zugewiesen, dh 7 + 1 (Oktober ist 7 Byte und 1 Byte für Nullterminator zur Kompilierzeit).
Zweite Aussage: Sie kopieren September (9 Byte bis 8 Byte Zeichenfolge);
da hast du größe von september als 8 bytes (noch strlen() funktioniert nicht für September, es hat kein Nullzeichen)
Das Zeichenfolgenliteral "september" enthält implizit das Nullzeichen, also strlen() funktioniert, wenn das Programm nicht bereits abgestürzt ist (aufgrund des Schreibens über das Ende der string Reihe)
– Timothy Jones
30. März 2012 um 5:17 Uhr
@TimothyJones: Es ist ein undefiniertes Verhalten, also gibt es technisch gesehen Optionen neben “Absturz” oder “Arbeit”. Schließen Sie niemals die Möglichkeit nasaler Dämonen aus.
– ShadowRanger
31. März 2021 um 14:39 Uhr
ola1olsson
Ihr Ziel-Array ist 8 Bytes (Länge von “Oktober” plus \0) und Sie möchten 9 Zeichen in dieses Array einfügen.
man strcpy sagt: Wenn der Zielstring eines strcpy() nicht groß genug ist, dann kann alles passieren.
Bitte sagen Sie mir, was Sie wirklich tun wollen, denn das riecht schon lange schlecht
Dies ist das Testprogramm zum Verständnis der Funktionsweise von sizeof()
– beparas
30. März 2012 um 6:32 Uhr
Agnius Wassilauskas
Sie müssen eliminieren Pufferüberlauf Problem in diesem Beispiel. Eine Möglichkeit, dies zu tun – ist zu verwenden strncpy:
Sie schreiben über das Ende des Arrays hinaus
string
. Dies ist ein undefiniertes Verhalten.string
kann nur 8 Zeichen enthalten (7 für “Oktober” und 1 für das Null-Terminator). Wenn du anrufststrcpy
schreiben Sie 10 Zeichen hinein (9 für “september” und 1 für das Null-Terminator), was bedeutet, dass Sie das Ende des Arrays überschritten haben und den angrenzenden Speicher überschreiben.– Marlon
30. März 2012 um 4:55 Uhr
Beachten Sie, dass
sizeof
berechnet wird kompilieren Zeit wo alsstrlen
ist Laufzeit.– Naveen
30. März 2012 um 4:57 Uhr
@Naveen: Beachten Sie, dass dies nicht unbedingt zutrifft, wenn VLAs beteiligt sind.
– Café
30. März 2012 um 5:31 Uhr
@caf: Vielleicht fühle ich mich ahnungslos, aber … Was meinst du mit VLAs? Sehr große Arrays? lol
– Cory Gross
7. August 2013 um 6:41 Uhr
Ich sage das in der Funktion
int foo(int n) { int a[n];
der Wertsizeof a
wird zur Kompilierzeit nicht berechnet.– Café
7. August 2013 um 7:49 Uhr