Sizeof vs. Strlen

Lesezeit: 3 Minuten

Benutzeravatar von beparas
beparas

#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

Benutzeravatar von Sean
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


Benutzeravatar von Praveen.thota
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

Benutzeravatar von ola1olsson
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


Benutzeravatar von Agnius Vasiliauskas
Agnius Wassilauskas

Sie müssen eliminieren Pufferüberlauf Problem in diesem Beispiel. Eine Möglichkeit, dies zu tun – ist zu verwenden strncpy:

memset(string, 0, sizeof(string));
strncpy(string, "september", sizeof(string)-1);

1402860cookie-checkSizeof vs. Strlen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy