/*************************************************************************
> 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. js原型链继承的傻瓜式详解

    本文争取用最简单的语言来讲解原型链继承的OOP原理 0.如果对原型继承还没有大致了解,完全一头雾水,请先阅读 <JavaScript高级程序设计>第六章最后部分的寄生组合式继承 或者_廖雪 ...

  2. linux shell脚本监控进程是否存在

    用shell脚本监控进程是否存在 不存在则启动的实例,先上代码干货:    #!/bin/shps -fe|grep processString |grep -v grepif [ $? -ne 0 ...

  3. docker (centOS 7) 使用笔记3 - 修改docker默认的虚拟网址

    近日在使用VPN时发现和docker的虚拟网址发生了冲突,都是172.17.0.1,故需要修改docker的默认网址. 1. 当前状态 # ifconfig docker0: flags=<UP ...

  4. [USACO15FEB]Superbull (最小生成树)

    题目链接 Solution 基本上就是个板子. 因为 \(n\) 很小,只有 \(2000\),所以直接暴力建图,然后跑最小生成树就好了. Code #include<bits/stdc++.h ...

  5. uva 11468 AC自动机+概率DP

    #include<cstdio> #include<cstring> #include<queue> #include<cstdio> #include ...

  6. C和C++内存分配方式记录

    C. C++中内存分配方式可以分为三种: (1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在.速度快.不容易出错,因为有系统会善后.例如全局变量,static变 ...

  7. QQ客服代码,支持临时会话

    <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=QQ号&site=qq&m ...

  8. 获取某个元素相对于视窗的位置-getBoundingClientRect

    1. getBoundingClientRect用于获取某个元素相对于视窗的位置集合.集合中有top, right, bottom, left等属性. 语法:这个方法没有参数 rectObject = ...

  9. HDU 5212 Code【莫比乌斯反演】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5212 题意: 给定序列,1≤i,j≤n,求gcd(a[i],a[j])∗(gcd(a[i],a[j] ...

  10. Android 防护扫盲篇

    一,已知防护策略 1.不可或缺的混淆 Java 是一种跨平台.解释型语言,Java 源代码编译成的class文件中有大量包含语义的变量名.方法名的信息,很容易被反编译为Java 源代码.为了防止这种现 ...