Forum: Compiler & IDEs memset() --> Speicher nicht nur auf 0 stellen sondern auf Wert


von ERER (Gast)


Lesenswert?

Wenn ich schreibe :
1
memset(int_array, 0, sizeof(int_array));
dann wird alles schön brav auf 0 gesetzt.

Jedoch wenn ich schreibe
1
memset(int_array, 3, sizeof(int_array));
dann wird leider irgendwas in das int_array geschrieben, nur nicht 3.

Ich bekomme dann 16843009 für jedes integerelement.

Ich finde in keiner Dokumentation was über die FUnktion memset. Mit 0 
funktionierts, aber sonst?

von Stefan R. (srand)


Lesenswert?

ERER schrieb:
> Ich bekomme dann 16843009 für jedes integerelement.

Der Wert sieht falsch aus, da hast du wohl Einsen reingeschrieben, nicht 
Dreien.

DIe Lösung ist aber ganz einfach: ein Schleife über die Elemente des 
Arrays und jedem Element die Drei zuweisen.

von Karl H. (kbuchegg)


Lesenswert?

ERER schrieb:
> Wenn ich schreibe :
>
1
memset(int_array, 0, sizeof(int_array));
> dann wird alles schön brav auf 0 gesetzt.
>
> Jedoch wenn ich schreibe
>
1
memset(int_array, 3, sizeof(int_array));
> dann wird leider irgendwas in das int_array geschrieben, nur nicht 3.

Logisch.
memset betrachtet deinen Speicher als ein Array von Bytes und schreibt 
in jedes Byte eine binäre 3 rein.
Bei einem 16 Bit int, der nun mal aus 2 Bytes besteht, ergibt die 
Bytekombination 0x0303 dann eben 771. Bei einem 32 Bit int, der aus 4 
Bytes besteht, ist die Bytekombination 0x03030303 dann eben dezimal 
50529027

>
> Ich bekomme dann 16843009 für jedes integerelement.

das wäre 0x01010101. D.h. du hast einen memset mit 1 gemacht. Ist aber 
egal. Gleiches Problem.

>
> Ich finde in keiner Dokumentation was über die FUnktion memset.

Google ist schon erfunden.
Macht aber nichts. Alle mem... Funktionen betrachten deinen Speicher als 
Byte-Array und nicht mehr.

Wenn du was anderes brauchst, dann musst du selber Hand anlegen. Zb mit 
einer Schleife.

von Tassilo H. (tassilo_h)


Lesenswert?

memset fuellt den Speicher byteweise.

http://www.cplusplus.com/reference/cstring/memset/

Die 16843009 sind doch auch sicher das Ergebnis von memset(int_array, 1, 
sizeof(int_array)); (eins, nicht drei!). Denn:
0x01010101 = 16843009 = (((((1 * 256) + 1) *256) +1) * 256) +1

Gruss

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

>> Jedoch wenn ich schreibe
>>
1
memset(int_array, 3, sizeof(int_array));
>> dann wird leider irgendwas in das int_array geschrieben, nur nicht 3.
>
> Logisch.

Überleg dir einfach mal, wie memset mit diesen Argumenten rausfinden 
soll, dass du ein int-Array hast. Was wäre anders, wenn es ein 
long-Array wäre?
Eben. memset hat keine Information darüber, wie groß ein Element deines 
Arrays ist. Also KANN das was du vor hast, überhaupt nicht 
funktionieren! Du brauchst dir nur die Argument-SChnittstelle von 
Funktionen ansehen. Die erzählen dir schon eine Menge darüber, was eine 
Funktion kann und was sie nicht kann. Auch Systemfunktionen können nicht 
zaubern.

von krumeltee (Gast)


Lesenswert?

Es gibt in manchen implementationen auch memsetw für word (16bit) und 
mehr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.