Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu memset



axeljaeger
09-08-2003, 17:55
Ich habe eine Frage zur Funktion memset, die so aussieht:



void *memset(void *s, int c, size_t n);


Die Konstante c wird n mal in den Speicher s geschrieben. c ist ein Integer also vermutlich 32 Bit breit. Folgendes Beispielprogramm zeigt jedoch, das memset nur die ersten 8 Byte kopiert. Was macht denn das für einen Sinn, den Parameter dann als int und nicht als char zu machen? Gibt es eine Funktion, die vielleicht die gesammten 32 Bit kopiert?



#include <cstring>
#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
unsigned char data [] = {0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88};
unsigned int pat = 0xFFFFFFFF;

memset(data, pat, 2);

for(int i = 0; i < 8; i++)
cout << "data[" << i << "] = " << (int)data[i] << endl;

// Eigentlich sollten alle Elemente von data FF sein

return 0;
}

wraith
09-08-2003, 18:20
Original geschrieben von axeljaeger
Die Konstante c wird n mal in den Speicher s geschrieben. c ist ein Integer also vermutlich 32 Bit breit. Folgendes Beispielprogramm zeigt jedoch, das memset nur die ersten 8 Byte kopiert.

Ja memset arbeitet auf bytes,nicht word oder dword.
Das Argument wird in unsigned char gewandelt.



Was macht denn das für einen Sinn, den Parameter dann als int und nicht als char zu machen?

Tja,das ist ebend ein C Relikt.
Zeichen ('a' - 'z' usw...) sind int nicht char,und die komische Integer Promotion (bei Funktionen mit/ohne Prototypen) spielt da wohl auch noch mit rein.



Gibt es eine Funktion, die vielleicht die gesammten 32 Bit kopiert?

Nimm eine Schleife,oder weil du sowieso C++ programmierst,gleich std::copy.Dann haste das beste beider Welten.

axeljaeger
10-08-2003, 12:35
Ich hab die Schleife genommen, weil ich in einem char*-Bereich arbeiten muss. Die Lösung mit der Schleife funktioniert auch, aber ich werde eure Hilfe demnächst nochmal brauchen, dann geht es darum, die Nullstellen einer Gleichung 3. Grades zu bestimmen.