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

 #include <stdio.h>
#include <stdlib.h>
#include <stddef.h> typedef struct LNode {
int F;
struct LNode* next;
}LNode, *LinkList;
int main()
{
LNode** map = (LNode **)malloc( * sizeof(LNode*) ); //分配5个结构体指针空间
for (int i = ; i < ; ++i) //这里循环对5个指针分配相应的空间
{
map[i] = (LNode *)malloc(*sizeof(LNode)); //分配10个节点空间
} for (int i = ; i < ; ++i)
for (int j = ; j < ; ++j)
{
(map[i] + j)->F = j;
}
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
printf("%d\t", (map[i] + j)->F);
}
printf("\n");
}
return ;
}

示例一:

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

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

 #include <stdio.h>
#include <stdlib.h>
#include <stddef.h> typedef struct LNode{
int F;
struct Lnode* next;
}LNode,*pLNode;
int main()
{
LNode** map = (LNode **)malloc(*sizeof(LNode*));
LNode *tMap = (LNode *)malloc( * * sizeof(LNode));
for (int i = ; i < ; ++i)
{
map[i] = (LNode *)((char *)tMap + i * * sizeof(LNode));
}
for (int i = ; i < ; ++i)
for (int j = ; j < ; ++j)
(map[i] + j)->F = j;
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
printf("%d\t", (map[i] + j)->F);
}
printf("\n");
}
free(tMap);
free(map);
return ;
}

示例二:

示例二思想: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。

 #include <stdio.h>
#include <stdlib.h>
#include <stddef.h> typedef struct LNode{
int F;
struct Lnode* next;
}LNode,*pLNode;
int main()
{
LNode** map = (LNode **)malloc(*sizeof(LNode*) + * * sizeof(LNode));
LNode *head = (LNode *)(map + ); //这里等价于map所指的地址加上5*sizeof(LNode*)
for (int i = ; i < ; ++i)
{
map[i] = head + i * ;
//这里原理类似,一定要理解int *a; 那么a + 3所指的地址就是"a指向的地址" + 3*sizeof(int)。 }
for (int i = ; i < ; ++i)
for (int j = ; j < ; ++j)
(map[i] + j)->F = j;
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
printf("%d\t", (map[i] + j)->F);
}
printf("\n");
}
free(map);
return ;
}

示例三:

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

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

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

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

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

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  2. Java数组之二维数组

    Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...

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

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  4. C++ 练气期之二维数组与矩阵运算

    1. 前言 C++中的一维数组可以存储线性结构的数据,二维数组可以存储平面结构的数据.如班上所有学生的各科目成绩就有二个维度,学生姓名维度和科目成绩维度. 这样的表格数据可以使用二维数组进行存储. 当 ...

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

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  6. 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)

    一位数组: #include <stdio.h> #include<string.h> #define N 5 void luru(float s[],int n); void ...

  7. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)

    全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...

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

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

  9. JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想

    JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...

随机推荐

  1. node 集群与稳定

    node集群搭建好之后,还需要考虑一些细节问题. 性能问题 多个工作进程的存活状态管理 工作进程的平滑重启 配置或者静态数据的动态重新载入 其它细节 1 进程事件 Node子进程对象除了send()方 ...

  2. TeamWork#3,Week5,Performance Test of Crawlers

    爬虫总体性能不错,能完成基本的网络数据爬取,没有功能上的缺陷.下图为饿了么网站商户信息爬取结果及原网站信息. 大部分信息是正确的,但也有一些错误.比如下图,小渝馆家常菜和渝码头川菜位置爬取错了. 再比 ...

  3. Mininet-Wifi 多接入点(Access Point)实验

    实验简介  这个实验来自Mininet-Wifi用户手册.在本实验中,我们会创建一个有三个AP的线式拓扑,并有三个站点(station)与每个AP通过无线相连.将通过这个时间简单演示一些Mininet ...

  4. "1001. A+B Format (20)" 解题报告

    Github : git@github.com:Circlecos/object-oriented.git PDF Of Markdown : "1001. A+B Format (20)& ...

  5. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.18

    1.当天站立式会议照片 本次会议在5号公寓312召开,本次会议内容:①:熟悉每个人想做的模块.②:根据老师的要求将项目划分成一系列小任务.③:在上次会议内容完成的基础上增加新的任务. 2.每个人的工作 ...

  6. iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件上传

    官方建议AFN的使用方法 0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目   •2. 或使用Cocopod 导入AFNetworking3.0+   •3.  引入 ...

  7. 解决tomcat登录需要给角色授权

    1:编辑/usr/local/tomcat/conf/tomcat-users.xml文件,在没有注释的内容中添加: <role rolename="manager-gui" ...

  8. Python网络爬虫(1)--url访问及参数设置

    环境:Python2.7.9 / Sublime Text 2 / Chrome 1.url访问,直接调用urllib库函数即可 import urllib2 url='http://www.baid ...

  9. git 常用命令总结(一)

    1.初始化版本库: .进入工程根目录目录 .创建项目目录 mkdir 项目目录名称 .进入创建的项目中 cd 项目名称 pwd 显示当前目录 .项目初始化 git init //完成后会在项目目录下生 ...

  10. 小程序 获取用户的openid

    wx.login({ success: res => { var code = res.code; //返回code // 小程序appid var appId = 'wxd751fc845c9 ...