Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ problem
Hi Leute!
Ich hab ein Problem bei folgendem Code:
#include "stdafx.h"
#include "string.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *ptr;
ptr=new char;
strcpy(ptr,"hallo");
printf("%s",ptr);
getchar();
delete(ptr);
return 0;
}
compilieren geht aber beim Ausführen bringt er nen Error (hängt denke ich mit dem delete zusammen)
nur Warum?
wäre nett wenn mir wer helfen könnten
Die Größe des Speichers hat sich geändert nach strcpy(ptr,"hallo"); und kann daher nicht mehr mit delete freiggeeben werden.
das hier geht, da sich an der größe nichts ändert
#include "stdafx.h"
#include "string.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *ptr=new char[6];
strcpy(ptr,"hallo\0"); // würde auch \0 gehen
printf("%s",ptr);
//getchar();
delete ptr;
return 0;
}
Das \0 ist explizit wenn du ein Stringliteral verwendest, also würde dieser String 7 Bytes haben!
Das \0 ist explizit wenn du ein Stringliteral verwendest, also würde dieser String 7 Bytes haben!
hm, das glaub ich nicht. eher wird es weg-optimiert bzw. das \0 nicht autom. hinzugefügt
muhkuh_rs
2006-10-24, 11:01:44
Hi Leute!
Ich hab ein Problem bei folgendem Code:
#include "stdafx.h"
#include "string.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *ptr;
ptr=new char;
strcpy(ptr,"hallo");
printf("%s",ptr);
getchar();
delete(ptr);
return 0;
}
compilieren geht aber beim Ausführen bringt er nen Error (hängt denke ich mit dem delete zusammen)
nur Warum?
wäre nett wenn mir wer helfen könnten
Nein, das delete ist nicht das Problem. Hier mal was der Code macht:
1. Speicher für einen EINZELNEN char auf dem heap anlegen
2. 5 chars und einen terminierenden null character in diesen Speicher kopieren.
3. auf Tastendruck warten und dann den Speicher wieder freigaben
D.h. Du schreibst in nicht alloziiertem Speicher rum. Vielleicht baut der Compiler im Debugmodus guards ans Ender der alloziierten Speicherbereiche und merkt beim delete, dass da jemand drübergebraten hat und meldet einen korrupten heap.
Du musst also mindestens Platz für 6 chars schaffen:
char *ptr=new char[6];
muhkuh_rs
2006-10-24, 11:06:12
hm, das glaub ich nicht. eher wird es weg-optimiert bzw. das \0 nicht autom. hinzugefügt
"Hallo\0" ist in der Tat 7 Zeichen lang, nur kopiert strcpy davon nur 6, da er bis zum ersten Stringterminator liest.
Selbst mit new char[6] hat man noch einen Bug.
Die einfachste richtige Lösung wär C++ zu benutzen:
std::string blub = "hallo";
std::cout << blub;
hm, das glaub ich nicht.
Es ist aber so.
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.