using System; class MainEntryPoint { static unsafe void Main() { int x=100; short y = -19; byte y2 = 45; double z = 31.5; int *pX = &x; short *pY = &y; double *pZ = &z; Console.WriteLine("Address of x is 0x{0:X}, size is {1}, value is {2}", (uint)&x, sizeof(int), x); Console.WriteLine("Address of y is 0x{0:X}, size is {1}, value is {2}", (uint)&y, sizeof(short), y); Console.WriteLine("Address of y2 is 0x{0:X}, size is {1}, value is {2}",(uint)&y2, sizeof(byte), y2); Console.WriteLine("Address of z is 0x{0:X}, size is {1}, value is {2}", (uint)&z, sizeof(double), z); Console.WriteLine("Address of pX=&x is 0x{0:X}, size is {1}, value is 0x{2:X}",(uint)&pX, sizeof(int*), (uint)pX); Console.WriteLine("Address of pY=&y is 0x{0:X}, size is {1}, value is 0x{2:X}",(uint)&pY, sizeof(short*), (uint)pY); Console.WriteLine("Address of pZ=&z is 0x{0:X}, size is {1}, value is 0x{2:X}",(uint)&pZ, sizeof(double*), (uint)pZ); *pX = 20; Console.WriteLine("After setting *pX, x = {0}", x); Console.WriteLine("*pX = {0}", *pX); pZ = (double*)pX; Console.WriteLine("x treated as a double = {0}", *pZ); } }
Get variable address in unsafe mode
using System; public class MainEntryPoint { public static unsafe void Main() { Console.WriteLine("Size of Currency struct is " + sizeof(MyStruct)); MyStruct amount1, amount2; MyStruct* pointerStruct = &amount1; long* pDollars = &(pointerStruct->Dollars); byte* pCents = &(pointerStruct->Cents); Console.WriteLine("Address of amount1 is 0x{0:X}", (uint)&amount1); Console.WriteLine("Address of amount2 is 0x{0:X}", (uint)&amount2); Console.WriteLine("Address of pAmt is 0x{0:X}", (uint)&pointerStruct); Console.WriteLine("Address of pDollars is 0x{0:X}", (uint)&pDollars); Console.WriteLine("Address of pCents is 0x{0:X}", (uint)&pCents); pointerStruct->Dollars = 20; *pCents = 50; Console.WriteLine("amount1 contains " + amount1); --pointerStruct; Console.WriteLine("amount2 has address 0x{0:X} and contains {1}", (uint)pointerStruct, *pointerStruct); MyStruct* pTempCurrency = (MyStruct*)pCents; pCents = (byte*)(--pTempCurrency); Console.WriteLine("Address of pCents is now 0x{0:X}", (uint)&pCents); Console.WriteLine(" Now with classes"); MyClass amount3 = new MyClass(); fixed (long* pDollars2 = &(amount3.Dollars)) fixed (byte* pCents2 = &(amount3.Cents)) { Console.WriteLine("amount3.Dollars has address 0x{0:X}", (uint)pDollars2); Console.WriteLine("amount3.Cents has address 0x{0:X}", (uint)pCents2); *pDollars2 = -100; Console.WriteLine("amount3 contains " + amount3); } } } struct MyStruct { public long Dollars; public byte Cents; public override string ToString() { return "$" + Dollars + "." + Cents; } } class MyClass { public long Dollars; public byte Cents; public override string ToString() { return "$" + Dollars + "." + Cents; } }
Allocating Memory from the Stack
using System;
public class MyClass
{
public unsafe static void Main()
{
int * buf = stackalloc int [5];
for(int i = 0; i < 5; i++) buf[i] = i; for(int i = 0; i < 5; i++) Console.WriteLine(buf[i]); } } [/csharp]
Fixing Managed Data in Memory
using System;
public class MyClass
{
public unsafe static void Main()
{
int i;
int [] intArr;
intArr = new int [5];
fixed(int * IntegerPointer = intArr)
{
for(i = 0; i < 5; i++)
IntegerPointer[i] = i;
}
for(i = 0; i < 5; i++)
Console.WriteLine(intArr[i]);
}
}
[/csharp]
Supported sizeof() Types
Expression Result sizeof(sbyte) 1 sizeof(byte) 1 sizeof(short) 2 sizeof(ushort) 2 sizeof(int) 4 sizeof(uint) 4 sizeof(long) 8 sizeof(ulong) 8 sizeof(char) 2 sizeof(float) 4 sizeof(double) 8 sizeof(bool) 1
Accessing Structure Members with a Pointer
using System; public struct Point2D { public int X; public int Y; } public class MyClass { public unsafe static void Main() { Point2D MyPoint; Point2D * PointerToMyPoint; MyPoint = new Point2D(); PointerToMyPoint = &MyPoint; PointerToMyPoint->X = 100; PointerToMyPoint->Y = 200; Console.WriteLine("({0}, {1})", PointerToMyPoint->X, PointerToMyPoint->Y); } }
Unsafe Methods
using System; public class MyClass { public unsafe static void Main() { int MyInteger = 123; int * MyIntegerPointer = &MyInteger; Console.WriteLine(*MyIntegerPointer); } }