/*************************************************************************
> File Name: C99_lengthenStruct.c
> Author: zshh0604
> Mail: zshh0604@163.com
> Created Time: 2014年10月16日 星期四 17时19分35秒
************************************************************************/ #include<stdio.h>
#include<stdlib.h>
#include<string.h>
/***
* C99中变成结构的实现。
*
* 一:变长结构体实现的两个原理。
* 1.结构体的地址空间是连续的。
* 2.数组的地址空间也是连续的。
*
* 二: 变长结构体的表示方法例如以下。
* 1. typedef struct
* {
* int data1;
* char data2[20];
* int data3[0];
* } data;
* 2.当中data3[0]必须是在结构体的最后的一个元素。
* 三:
* Demo说明怎样进行数据存取。 *
*/
/**
* 用来測试变长结构体的数据结构。
*/
typedef struct
{
int data1;
char data2[20];
int data3[0];
}data; /***
* 測试将结构体存放到可变结构体中
*/
typedef struct
{
int data1;
char data2[30];
char data3[0];
}datas;
/*
*測试将people结构体存放到datas中。
*/
typedef struct
{
int id;
char name[30];
}people; /***
* 初始可变长结构体。
*/
void init_data(void)
{
data * d = NULL;
int i = 0;
d = malloc(sizeof(data)+sizeof(int)*30);
if(d== NULL)
{
printf("分配地址空间失败\n");
return;
}
d->data1 = 10;
strncpy(d->data2,"hello world",strlen("hello world")+1); for(i=0;i<30; i++)
{
d->data3[i] = i;
printf("d->data3[%d] = %d\n",i,d->data3[i]);
}
} void init_datas(void)
{
datas * d = NULL;
people p;
people *p1;
d = malloc(sizeof(datas) + sizeof(people)); p.id = 10;
strncpy(p.name,"gameone",strlen("gameone")+1); memcpy(d->data3,&p,sizeof(people)); p1 = (people*) d->data3;
printf("p1.id = %d\n", p1->id);
printf("p1.name = %s\n", p1->name);
return;
} void main(void)
{
init_data();
init_datas();
}
转载请注明出处 http://blog.csdn.net/shaohuazuo/article/details/40159531

C99_变长结构体实现的更多相关文章

  1. 结构体(struct)大小

    结构体(struct)大小 本文参考链接:C语言结构体(struct)常见使用方法,链接中的实例代码经实践有几处不准确,本文在引用时已做更改 注意:在结构体定义时不能申请空间(除非是结构体变量),不可 ...

  2. c 结构体中的变长数组

    在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构: struct pppoe_tag { __u16 tag_type; __u16 tag_len; ...

  3. [问题]C# 结构体对齐:如何将变长byte数组对齐

    [StructLayout(LayoutKind.Sequential,Pack=1)] struct Report_Read_Parameter { byte Confirmation; byte ...

  4. [IDA] 将连续的单个变量值修改为结构体

    直接选中最上边的结构体,使用ALT+Q来进行修改.

  5. GCC 中零长数组与变长数组

    前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...

  6. C++内存分配及变长数组的动态分配

    //------------------------------------------------------------------------------------------------ 第 ...

  7. 失落的C语言结构体封装艺术

    Eric S. Raymond <esr@thyrsus.com> 目录 1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 ...

  8. slots - Python的结构体 转

          上个月看了篇文章 “SAVING 9 GB OF RAM WITH PYTHON’S __SLOTS__”,原来Python也有类似结构体的东东.拖了一个月才写这篇,是因为太久没看pyth ...

  9. oracle函数、包、变量的定义和使用、重点”结构体和数组”

    函数 实例1:输入雇员的姓名,返回该雇员的年薪 create function fun1(spName varchar2) ,); begin +nvl(comm,) into yearSal fro ...

随机推荐

  1. ThinkPHP3.2 杂记

    如果父类有_initialize()方法,子类用任何方法前都会调用父类的 _initialize方法,避免这种现象可以在子类中声明_initialize()方法,可以控制是否调用父类的_initial ...

  2. 测试jsonp

    login<?php $type = $_GET['type']; if(empty($type)) { $url = ""; }else { if($type == 'lo ...

  3. HDU——2067小兔的棋盘(卡特兰数&递推DP)

    小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. BZOJ3325 [Scoi2013]密码 【manacher】

    题目 Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息: 该密码的长度 ...

  5. 【hihocoder】欧拉路径 并查集判连通

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  6. oracle distinct 用法

    oracle distinct 是所有字段都相同才显示一条,要做到根据某一列,则如下 select t1.* from table t1 where t1.rowid = (select min(t2 ...

  7. 【CF173B】Chamber of Secrets(二分图,最短路)

    题意:给你一个n*m的地图,现在有一束激光从左上角往右边射出,每遇到‘#’,你可以选择光线往四个方向射出,或者什么都不做,问最少需要多少个‘#’往四个方向射出才能使关系在n行往右边射出. 思路:将每一 ...

  8. 【CF712D】Memory and Scores(概率,DP,前缀和)

    题意:AB两人玩一个游戏,两人玩t轮 每人每次随机且等概率从[-k,k]中取一个数字加到总得分中 得分高者赢 已知A B初始分别有a b分,问A取得胜利的概率是多少 (1 ≤ a, b ≤ 100,  ...

  9. 在 Mac OS X 环境中从源代码编译安装 FFmpeg

    最近因为一个项目要求,需要开发实时视频编解码功能,准备采用 FFmpeg 以 x264 方式进行实时的视频编解码.Windows 以及 Linux 环境下的 FFmpeg 动态库.头文件等资源都非常容 ...

  10. react 生命周期详解

    state有时候很不听话,在某些时候,我不想他渲染,偏偏react非常智能的帮我们重复渲染. 比如最常见的就是传递的对象为空,组件依旧渲染了一次或者多次. 更多场景不举例了,对症下药. shouldC ...