Unsicherer Code via unsafe Zeiger in C (Teil 4)
Kommentare

Zeigeroperationen
Innerhalb eines unsafe-Blocks können genau wie in C/C++ Zeigeroperationen durchgeführt werden. Aus Platzgründen werden hier nur die elementarsten Zeigeroperationen, die auch in Tabelle

Zeigeroperationen

Innerhalb eines unsafe-Blocks können genau wie in C/C++ Zeigeroperationen durchgeführt werden. Aus Platzgründen werden hier nur die elementarsten Zeigeroperationen, die auch in Tabelle 1 zusammengefasst wurden, vorgestellt. Listing 4 zeigt, wie ein Zeiger deklariert und verwendet werden kann. Ein Zeiger wird immer in der Form Datentyp gefolgt von einem Sternchen (*) deklariert. Alle danach aufgeführten Variablen sind Zeigervariablen, d. h. das Sternchen (*) muss nicht für jede Variable wiederholt werden. Das Beispiel in Listing 4 legt zunächst eine Variable vom Typ int an und initialisiert den Wert auf 42. Danach wird eine Zeigervariable angelegt, der noch keinen Wert zugewiesen wurde. Der spätere Inhalt der Speicheradresse wird als Integer interpretiert. In der dritten Zeile wird der Zeiger auf die zuvor erstellte und initialisierte int-Variable gesetzt. Da nun beide Variablen auf die gleiche Speicheradresse zeigen, wird auch jeweils der gleiche Wert ausgegeben.

Zeigersyntax

Funktion

&

Ermittlung der Speicheradresse einer Variablen (address-of)

*

Zugriff auf den Inhalt einer Zeigervariablen

->

Vereinfachter Zugriff auf Member einer Struktur

fixed

Fixierung einer Speicheradresse, verhindert, dass die GC die Adresse verschiebt bzw. freigibt

Tabelle 1: Elementare Zeigersyntax und Schlüsselwörter

Listing 4

public static unsafe void UsingPointers()
{
  int zahl = 42;
  int* ptrZahl;
  ptrZahl = &zahl;
  Console.WriteLine("Variable zahl: {0}.", zahl);
  Console.WriteLine("Variable ptrZahl: {0}.", *ptrZahl);
}  

Zeiger-Member-Zugriff mittels -> Operator

Werden anstatt einfachen Wertetypen Strukturen (struct) verwendet, die aus mehreren Wertetypen zusammengesetzt sind, kann zur vereinfachten Dereferenzierung und für den Feldzugriff der Operator -> verwendet werden (Listing 5).

Listing 5

public struct PIN {
  public int no1, no2, no3, no4;
}
public static unsafe void UsingStruct()
{
  PIN pin = new PIN();
  PIN* ptrPIN = &pin;
  ptrPIN->no1 = 1; // einfacher
  (*ptrPIN).no2 = 2; // Auch möglich
  Console.WriteLine("PIN: {0},{1},{2},{3}", 
  ptrPIN->no1, ptrPIN->no2, ptrPIN->no3, ptrPIN->no4);
}  

Die Struktur (struct) PIN enthält vier int-Variablen. Innerhalb der Methode UsingStruct wird eine Struktur angelegt und der Zeiger ptrPIN wird auf die Speicheradresse der angelegten Struktur gesetzt. Danach werden den Feldern no1 und no2 jeweils Werte zugewiesen. Bei der ersten Zuweisung wird der -> Operator verwendet, die zweite Variante dereferenziert zunächst mittels * und greift dann per Punktnotation auf die Felder zu. Durch die Verwendung des -> Operators wird jedoch die Lesbarkeit des Quellcodes verbessert.

Speicher befestigen

Die generelle Arbeitsweise von Zeigern und der Zeigerarithmetik ist vergleichbar mit der bekannten C/C++-Syntax. Da aber ein unsafe-Bereich unter der Kontrolle der CLR ausgeführt wird, kann es zu unerwünschten Eingriffen durch die automatische Speicherbereinigung (Garbage Collection, GC) kommen. Um zu verhindern, dass die GC eine bewegliche Variable verschiebt, muss diese per fixed-Anweisung fixiert werden. Andernfalls kann es passieren, dass eine Zeigervariable verschoben und somit unbrauchbar wird.

Zusammenfassung

Innerhalb eines unsafe-Blocks können aus C bzw. C++ gewohnte Zeigeroperationen durchgeführt werden. Dabei verlässt man aber nicht vollständig, wie bei dem Aufruf von nicht verwaltetem Code (Unmanaged Code), die Sicherheit der CLR. In der nächsten C#-Kolumne wird detaillierter auf die Verwendung von Zeigern, deren Syntax und der fixed-Anweisung eingegangen

Marc André Zhou arbeitet als Senior Consultant bei der Logica Deutschland GmbH & Co. KG. Seine Schwerpunkte liegen im Bereich SharePoint, Softwarearchitekturen und Frameworks, hier hauptsächlich im .NET-Umfeld. Sie erreichen ihn unter marc.andre.zhou@logica.com.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -