在前一篇中构造的双向循环链表,指针变量所指向的地址实属静态分配,把结构体的成员字段赋值后,运行库就会分配一定内存给该变量。.NET中实现动态分配内存使用关键字"stackalloc","stackalloc"取意为在堆栈上分配地址,"stackalloc"的用法:
person* p_person = stackalloc person[4];
stackalloc后接值类型名称[变量个数],返回一个指针变量或指针变量数组。假设以p_person[0]为例,p_person[0]只作为一个普通的变量使用,只能使用.操作符,不能使用->操作符,等同于一个数组元素了。注意:数组元素的上限也必须小于指定的变量个数,否则运行库不能handle这个错误。实现为双向循环链表动态分配内存的main方法:
1 static void Main(string[] args)
2 {
3 unsafe
4 {
5 person* p_person = stackalloc person[4];
6 person* point;
7 int index = 0;
8
9 p_person[0].id = Guid.NewGuid();
10 p_person[1].id = Guid.NewGuid();
11 p_person[2].id = Guid.NewGuid();
12 p_person[3].id = Guid.NewGuid();
13
14 p_person[0].previous = &p_person[3];
15 p_person[1].previous = &p_person[0];
16 p_person[2].previous = &p_person[1];
17 p_person[3].previous = &p_person[2];
18
19 p_person[0].next = &p_person[1];
20 p_person[1].next = &p_person[2];
21 p_person[2].next = &p_person[3];
22 p_person[3].next = &p_person[0];
23
24 point = &p_person[0];
25
26 do
27 {
28 Console.WriteLine("id:{0}" + "\n" +
29 "previous address:0x{1:X}" + "\n" +
30 "next address:0x{2:X}" + "\n",
31 point->id, (uint)point->previous, (uint)point->next);
32 point = point->next;
33 index++;
34 }
35 while (index != FOUR);
36 }
37 }