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

时间:2022-08-30 19:43:24

这个问题我纠结了蛮久了,因为前面一直忙(自己也懒了点),所以没有能好好研究这个。希望这篇文章能够帮助你们。

c动态分配结构体二维数组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、为指针指的地方分配相应节点数空间。

 

c动态分配结构体二维数组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,*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。

c动态分配结构体二维数组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,*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

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