Ich habe Interaktionen zwischen malloc() und verschiedenen String-Funktionen getestet, um zu versuchen, mehr darüber zu lernen, wie Zeiger und Speicher in C arbeiten, aber ich bin etwas verwirrt über die folgenden Interaktionen.malloc und strcpy Interaktionen
char *myString = malloc(5); // enough space for 5 characters (no '\0')
strcpy(myString, "Hello"); // shouldn't work since there isn't enough heap memory
printf(%s, %zd\n", myString, strlen(myString)); // also shouldn't work without '\0'
free(myString);
Alles oben scheint ordnungsgemäß zu funktionieren. Ich habe versucht, printf() für jedes Zeichen zu verwenden, um zu sehen, ob der Null-Terminator vorhanden ist, aber '\ 0' scheint nur als Leerzeichen zu drucken.
Meine Verwirrung liegt in:
- Stringliterale immer einen impliziten Nullabschluss haben.
- strcpy sollte über dem Nullabschluss auf myString kopieren, aber es gibt nicht genug zugeordnet Heap-Speicher
- printf/Strlen nicht funktionieren sollte, es sei denn myString einen Terminator hat
Da myString offenbar ein Nullabschluss hat , wo ist es? Wurde es nur an einem zufälligen Speicherort platziert? Ist der obige Code ein Fehler, der auf Sie wartet?
Pufferüberlauf. – jxh
Wiederhole nach mir: "Undefiniertes Verhalten" bedeutet "undefiniert". Es bedeutet nicht "garantiert ausfallen", "wird Warnungen erzeugen" oder irgendetwas anderes vorhersagbares. Nur weil es funktioniert, heißt das nicht, dass nichts falsch ist. –
Sie rufen ein undefiniertes Verhalten auf, indem Sie Ihren Puffer überschreiben. Sie haben nur Glück, dass "jedes oben genannte richtig zu funktionieren scheint". Eigentlich sollte ich _un_lucky sagen, weil Sie hoffen, dass Ihr Programm abstürzt, wenn es solche Probleme gibt, damit Sie sie beheben können. Ansonsten manifestieren sie sich am unpassendsten der Zeit ... – yano