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

作者:名不見
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM