::operator new(10)
-
Danke erst mal für den Hinweis/Hilfe, das hilft mir schon sehr viel weiter!
Ich kann also mit den [] arbeiten, aber auch direkt damit? Und ich muß nur aufpassen das ich nicht über die 10 byte Grenze drüberhinausschieße?
Also würde in deinem int-Fall ptr[2] zb nicht mehr funktionieren, wenn int 4 byte groß ist?
-
p[2];entspricht (wenn p ein Zeiger und nicht void* ist)
*(p + 2);, du kannst den []-Operator also ohne Probleme verwenden. Natürlich darfst du dabei nicht auf unallokierten Speicher zugreifen, aber der Compiler bewahrt dich nicht davor, da musst du selber drauf achten.
-
nee, das ist schon klar das ich selbst drauf achten muß, ist selbstverständlich

Vielen dank für eure Hilfe, wirklich sehr schnell und produktiv =))
-
@VirtualDreams:
Du hast übrigens schon recht:
Wenn du den Zeiger der auf deine 10 Byte zeigt in einen int castest, dann hast du nur Zugriff auf p[0] und p[1], da von p[2] nur 2 byte allokiert sind.
-
du würdest mit einem zugriff auf p[2] 2 bytes überschreiben die dir nicht gehören (vorausgesetzt int == 4 byte) deswegen sollte in der speicheranforderung nicht die anzahl der bytes stehen sondern ein vielfaches der größe des gewünschten typs:
void* mem = operator new(3 * sizeof(int) );
-
Dann kann ich doch gleich ein int array erzeugen:
int *ptr = new int[10]Was ist der dann sinn von dem konstrukt?

-
.filmor schrieb:
p[2];entspricht (wenn p ein Zeiger und nicht void* ist)
*(p + 2);, du kannst den []-Operator also ohne Probleme verwenden. Natürlich darfst du dabei nicht auf unallokierten Speicher zugreifen, aber der Compiler bewahrt dich nicht davor, da musst du selber drauf achten.
Genaugenommen entspricht p[ 2 ] einem *( p + 2 * sizeof( p ) )
-
@lolz:
Nein.
-
nein. es wird nicht der abstand in bytes angegeben sondern in einheiten der größe des entsprechenden typs. mit p == int == 4 bytes übernimmt der compiler die stelle *sizeof (p) weswegen man dies auch weglässt und theoretisch auch 2[p] schreiben könnte.
gute frage warum man es so schreibt sicherlich könnte man wenn man es unbedingt byte genau haben will auch ein char array definieren.
-
hmpf schonwieder zu spät

-
lolz schrieb:
Genaugenommen entspricht p[ 2 ] einem *( p + 2 * sizeof( p ) )
falsch.
(char*)(p+2) ist bereits (char*)p+2*sizeof(p)
-
[quote="volkard"]
lolz schrieb:
Genaugenommen entspricht p[ 2 ] einem *( p + 2 * sizeof( p ) )
Aber Deine Formel macht es nicht besser

Die Formel ist tatsächlich etwas irreführend, weil- sie "+" schreibt, wo der Compiler bei einem gegebenen "+" bereits um sizeof(...) im Adressraum weiterginge, aber
- "soviel Bytes weiter" meint.
Ich hätte noch einen ganz anderen Einwand:
eigentlich müsste es "sizeof(*p)" heißen, oder ?Gruß,
Simon2.
-
Weil (char*)p + 2 * sizeof(p) == &p[2] == (p + 2) != (p + 2 * sizeof(p)).
-
Simon2 schrieb:
eigentlich müsste es
"byteposition(p[ 2 ]) entspricht ...genao. statt "byteposition" zu schreiben hab ich auf char* gecastet.
-
mmhh, ist ein pointer nicht immer 4 byte groß?
deswegen funzt auch sowas wie forward deklaration etc.
und genau deswegen stimme ich dem einwand von simon2 zu.
-
ConfusedGuy schrieb:
mmhh, ist ein pointer nicht immer 4 byte groß?
Nö. Auf x86_64 Systemen ist er 8 Byte groß.