2009-05-10 7 views
0

In C, in einer Unix-Umgebung (Plan9), habe ich ein Array als Speicher.Int in einem simulierten Speicherarray von uchar

uchar mem[32*1024]; 

Ich brauche das Array zu verschiedenen Bereichen, wie beispielsweise ein int (integer), um anzuzeigen, die Größe des Speichers frei und avaliable enthalten. Also, ich habe dies versucht:

uchar* memp=mem; 
*memp=(int)250; //An example of size I want to assign. 

Ich weiß, die Größe eines int ist 4, so dass ich mit dem Gießen oder so etwas zu erzwingen, dass der Inhalt der ersten vier Schlitze von mem die Anzahl hat 250 in diesem Fall ist es Big Endian.

Aber das Problem ist, wenn ich versuche zu tun, was ich erklärte, es funktioniert nicht. Ich nehme an, dass es einen Fehler bei der Umwandlung von Typen gibt. Ich frage dich hoffentlich, wie könnte ich erzwingen, dass mem [0] zu mem [3] die angegebene Größe hat, dargestellt als int und nicht als uchar?

Vielen Dank im Voraus

Antwort

2

So:

*((int*) memp) = 250; 

, der sagt: „Auch wenn memp ein Zeiger auf Zeichen ist, möchte ich Sie es als ein Zeiger auf ganze Zahlen zu behandeln, und diese ganze Zahl setzen, wo es Punkte. "

+0

Ok, danke, es funktioniert. Und ich habe den Punkt verstanden. –

+0

Aber wenn ich einen Zeiger auf einen anderen Teil von Mem (das Array von Zeichen ohne Vorzeichen) zuweisen möchten, am Anfang zu Null. Könnte ich etwas in der Art machen ?: * ((void *) memp) = nil; Es kompiliert nicht. :( –

+0

Es ist nie möglich, einen (void *) -Zeiger zu dereferenzieren – ephemient

0

Zeiger auf int, nicht unsigned char wieder werfen!

int * memp = (int *)mem; 
* memp = 250; //An example of size I want to assign. 
2

Haben Sie eine Vereinigung betrachtet verwenden, wie in:

union mem_with_size { 
    int size; 
    uchar mem[32*1024]; 
}; 

Dann müssen Sie nicht über das Casting kümmern. (Sie müssen sich natürlich immer noch um die Byte-Reihenfolge kümmern, aber das ist ein anderes Problem.)

1

Wie bereits erwähnt, müssen Sie einen Zeiger auf int übergeben. Sie müssen auch sicherstellen, dass Sie die Ausrichtung des Zeigers berücksichtigen: Bei vielen Architekturen muss ein int an einem Speicherplatz beginnen, der durch sizeof (int) teilbar ist, und wenn Sie versuchen, auf einen nicht ausgerichteten int zuzugreifen, erhalten Sie a SIGBUS. Auf anderen Architekturen funktioniert es, aber langsam. Bei anderen funktioniert es schnell.

Eine tragbare Art und Weise, dies zu tun sein könnte:

int x = 250; 
memcpy(mem + offset, &x, sizeof(x)); 

Gewerkschaften verwenden, kann dies erleichtern, obwohl, so +1 bis JamieH.

Verwandte Themen