PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ problem


Gast
2006-10-23, 22:01:55
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

Gast
2006-10-23, 23:15:18
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;
}

Gast
2006-10-23, 23:50:51
Das \0 ist explizit wenn du ein Stringliteral verwendest, also würde dieser String 7 Bytes haben!

Gast
2006-10-24, 00:00:40
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.

Trap
2006-10-24, 12:32:15
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;

Gast
2006-10-24, 13:55:15
hm, das glaub ich nicht.

Es ist aber so.