zoukankan      html  css  js  c++  java
  • 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	", (map[i] + j)->F);
    27         }
    28         printf("
    ");
    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	", (map[i] + j)->F);
    25         }
    26         printf("
    ");
    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	", (map[i] + j)->F);
    27         }
    28         printf("
    ");
    29     }
    30     free(map);
    31     return 0;
    32 }
    示例三:

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

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

    作者:名不见
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
  • 相关阅读:
    java基础知识--数据结构
    java基础知识--Iterator迭代器
    java基础知识--Collection、Collections、泛型
    java基础知识--包装类
    java基础知识--日期时间类
    java基础知识--final关键字
    java基础知识--类和接口
    Mina学习之---mina整体流程介绍
    多线程之----线程互斥再续
    多线程之----线程互斥
  • 原文地址:https://www.cnblogs.com/mingbujian/p/4781622.html
Copyright © 2011-2022 走看看