c动态分配结构体二维数组
这个问题我纠结了蛮久了,因为前面一直忙(自己也懒了点),所以没有能好好研究这个。希望这篇文章能够帮助你们。
#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动态分配结构体二维数组的更多相关文章
- 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- Java数组之二维数组
Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...
- 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- C++ 练气期之二维数组与矩阵运算
1. 前言 C++中的一维数组可以存储线性结构的数据,二维数组可以存储平面结构的数据.如班上所有学生的各科目成绩就有二个维度,学生姓名维度和科目成绩维度. 这样的表格数据可以使用二维数组进行存储. 当 ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)
一位数组: #include <stdio.h> #include<string.h> #define N 5 void luru(float s[],int n); void ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想
JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...
随机推荐
- PHP中你应该知道的require()文件包含的正确用法
以前看一些PHP框架源码的时候,很奇怪在文件包含的时候,会用dirname(__FILE__)来拼凑文件路径,不知道这样做有什么好处,后来终于发现了其中的缘由. 我们来看一个简单的例子: 有a,b,c ...
- git push remote: User permission denied
这种错误因为本地保存了一个错误的账号密码,只需要重新编辑成正确的账号密码 直接上方法
- mysql/mybatis之合并两个表的查询结果
下面这段sql是把两个表中各自符合条件的count值相加,返回结果是两个之和 SELECT sum(result) FROM ( SELECT COUNT(*) result FROM TEST_A ...
- Daily Scrum (2015/10/31)
这几天我们组的进度有点慢,剩下这一周的我们必须要加油认真对待. 周末这两天我们是这样安排的: 成员 今日任务 时间 明日任务 符美潇 数据库部分代码的编写 1h 每周小组例会 潘礼鹏 团队博客作业 ...
- Java未赋值变量的默认初始值
在 Java 程序中,任何变量都必须经初始化后才能被使用.当一个对象被创建时,实例变量在分配内存空间时按程序员指定的初始化值赋值,否则系统将按下列默认值进行初始化: 数据类型 初始值 byte 0 s ...
- 软件项目的开发之svn的使用
Svn简介 SVN全名Subversion,即版本控制系统.SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操作系统.作为一个开源的版本控制系统,Subversion管理着随时间改变的数据.这 ...
- 30_数据库_第30天java_jdbc_(DBUtils)_讲义
今日内容介绍 1.DBUtils 2.连接池 01DButils工具类的介绍个三个核心类 * A: DButils工具类的介绍个三个核心类 * a: 概述 * DBUtils是java编程中的数据库操 ...
- cropper.js 超级好用的裁剪图片工具
最近要做一个照片裁剪功能.就选用了cropper.js 代码如下:贴出来 <div class="container"> <div class="row ...
- [转帖]剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)
剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER) 博客分类: 原博客地址: http://qq85609655.iteye.com/blog/2035176 distrib ...
- Java-JDBC.mysql 工具类 读取本地文件配置
引用 mysql-connector-jav 的jar 配置文件为 database.propertties . 格式如下 driverClass=com.mysql.jdbc.Driver ur ...