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/mingbujian/p/4781622.html

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

时间: 2024-10-08 10:31:49

c动态分配结构体二维数组的相关文章

【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在数据类型的后面,也可以在数组名称的后面,其它的依次类推. 例如: int[][] map; char c[][]; 和一维数组一样,数组声明以后在内存中没有分配具体的存储空间,也没有设定数组的长度.  -------------------------------------------------

2015.12.13 二维数组 函数指针 结构体

先说一下指针的用途:1.访问函数,在函数内部需要改变外部传入内部的值:2.函数中需得到一个连续存储空间的首地址:3.动态分配内存,需要记录分配内存的首地址.说穿了,指针的用途就是和地址相关的. 二维数组 定义方法 ①int temp1 [2][3] = {}; 第一个中括号是“行”,第二个中括号是“列”. ②int temp2 [][3] = {1,2,3,4,5,6}; “列数”不需要明确指出. ③int temp3 [2][3] = {1,2,3,4}; 后两个元素为0. char *nam

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

C语言一维数组、二维数组、结构体的初始化

C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,a[0]=0,a[1]=1,… ,a[9]=9. (2)初始化时可以只对一部分元素赋初值.例如: static int a[10]={0,1,2,3,4}; 定义的数组有10个元素,但只对其中前5个元素赋了初值,后5个元素初值为0. (3)将数组的元素值全部为0,可以用下面的方法:(方法一)

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

C#调用C++ 平台调用P/Invoke 结构体--含有内置数据类型的一维、二维数组、字符串指针【六】

[1]结构体中含有内置数据类型的一维数组 C++代码: typedef struct _testStru3 { int iValArrp[30]; WCHAR szChArr[30]; }testStru3; EXPORTDLL_API void Struct_ChangeArr( testStru3 *pStru ) { if (NULL == pStru) { return; } pStru->iValArrp[0] = 8; lstrcpynW(pStru->szChArr, L&quo

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

【转载】二维数组的动态分配和参数传递

本篇随笔为转载,原贴地址:http://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.html. 1. C语言动态分配二维数组 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]

C语言动态分配二维数组内存

C语言内存管理主要包括malloc().remalloc().free()三个函数. malloc原型 extern void *malloc(unsigned int num_bytes); m行n列的 二维数组的分配,主要有三种方法: 一.分配一个长度为m的二级指针,指针的指向的内容分别指向一个长度为n的一位数组 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h>