c动态分配结构体二维数组

这个问题我纠结了蛮久了,因为需要学习的东西太多,所以没有能好好研究这个。希望这篇文章能够帮助你们。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stddef.h>
 4 
 5 typedef struct LNode {
 6     int F;
 7     struct LNode* next;
 8 }LNode, *LinkList;
 9 int main()
10 {
11     LNode** map = (LNode **)malloc(5 * sizeof(LNode*) ); //分配5个结构体指针空间
12     for (int i = 0; i < 5; ++i) //这里循环对5个指针分配相应的空间
13     {
14         map[i] = (LNode *)malloc(10*sizeof(LNode)); //分配10个节点空间
15     }
16 
17     for (int i = 0; i < 5; ++i)
18         for (int j = 0; j < 10; ++j)
19         {
20             (map[i] + j)->F = j;
21         }
22     for (int i = 0; i < 5; ++i)
23     {
24         for (int j = 0; j < 10; ++j)
25         {
26             printf("%d\t", (map[i] + j)->F);
27         }
28         printf("\n");
29     }
30     return 0;
31 }
示例一:

示例一思想:1、分配结构体指针空间;

      2、为指针指的地方分配相应节点数空间。

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stddef.h>
 4 
 5 typedef struct LNode{
 6     int F;
 7     struct Lnode* next;
 8 }LNode,*pLNode;
 9 int main()
10 {
11     LNode** map = (LNode **)malloc(5*sizeof(LNode*));
12     LNode *tMap = (LNode *)malloc(5 * 10 * sizeof(LNode));
13     for (int i = 0; i < 5; ++i)
14     {
15         map[i] = (LNode *)((char *)tMap + i * 10 * sizeof(LNode));  
16     }
17     for (int i = 0; i < 5; ++i)
18         for (int j = 0; j < 10; ++j)
19         (map[i] + j)->F = j;
20     for (int i = 0; i < 5; ++i)
21     {
22         for (int j = 0; j < 10; ++j)
23         {
24             printf("%d\t", (map[i] + j)->F);
25         }
26         printf("\n");
27     }
28     free(tMap);
29     free(map);
30     return 0;
31 }
示例二:

示例二思想:1、分配结构体指针空间;

      2、分配相应节点数的空间;

      3、用指针数组来分割。

注:我刚开始写的是“map[i] = tMap + i * 10 * sizeof(LNode);”这么一句,由于这里tMap是LNode结构体指针,所以他移动为【i * 10 * sizeof(LNode)】*sizeof(LNode)。举个例子int *a; 那么a +3; 就是 "a指向的地址" + 3*sizeof(int)。所以,如果非要这样这样相加的话可以把tMap转换为char*类型的地址在相加,最后再强制类型转换,即如代码中所示map[i] = (LNode *)((char *)tMap + i * 10 * sizeof(LNode))。当然亦可如map[i] =tMap + i * 10。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stddef.h>
 4 
 5 typedef struct LNode{
 6     int F;
 7     struct Lnode* next;
 8 }LNode,*pLNode;
 9 int main()
10 {
11     LNode** map = (LNode **)malloc(5*sizeof(LNode*) + 5 * 10 * sizeof(LNode));
12     LNode *head = (LNode *)(map + 5); //这里等价于map所指的地址加上5*sizeof(LNode*)
13     for (int i = 0; i < 5; ++i)
14     {
15         map[i] = head + i * 10;  
16         //这里原理类似,一定要理解int *a; 那么a + 3所指的地址就是"a指向的地址" + 3*sizeof(int)。
17         
18     }
19     for (int i = 0; i < 5; ++i)
20         for (int j = 0; j < 10; ++j)
21         (map[i] + j)->F = j;
22     for (int i = 0; i < 5; ++i)
23     {
24         for (int j = 0; j < 10; ++j)
25         {
26             printf("%d\t", (map[i] + j)->F);
27         }
28         printf("\n");
29     }
30     free(map);
31     return 0;
32 }
示例三:

这里是直接分配一大块空间,然后再用指针来分割的。只要理解前面两个了,这里并不难。

关于二维数组作为函数参数的用法可参见:http://www.cnblogs.com/Anker/archive/2013/03/09/2951878.html

作者:名不见
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

 

posted @ 2015-09-04 13:31  名不见  阅读(3864)  评论(0编辑  收藏  举报