C99_变长结构体实现
/*************************************************************************
> 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_变长结构体实现的更多相关文章
- 结构体(struct)大小
结构体(struct)大小 本文参考链接:C语言结构体(struct)常见使用方法,链接中的实例代码经实践有几处不准确,本文在引用时已做更改 注意:在结构体定义时不能申请空间(除非是结构体变量),不可 ...
- c 结构体中的变长数组
在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构: struct pppoe_tag { __u16 tag_type; __u16 tag_len; ...
- [问题]C# 结构体对齐:如何将变长byte数组对齐
[StructLayout(LayoutKind.Sequential,Pack=1)] struct Report_Read_Parameter { byte Confirmation; byte ...
- [IDA] 将连续的单个变量值修改为结构体
直接选中最上边的结构体,使用ALT+Q来进行修改.
- GCC 中零长数组与变长数组
前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...
- C++内存分配及变长数组的动态分配
//------------------------------------------------------------------------------------------------ 第 ...
- 失落的C语言结构体封装艺术
Eric S. Raymond <esr@thyrsus.com> 目录 1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 ...
- slots - Python的结构体 转
上个月看了篇文章 “SAVING 9 GB OF RAM WITH PYTHON’S __SLOTS__”,原来Python也有类似结构体的东东.拖了一个月才写这篇,是因为太久没看pyth ...
- oracle函数、包、变量的定义和使用、重点”结构体和数组”
函数 实例1:输入雇员的姓名,返回该雇员的年薪 create function fun1(spName varchar2) ,); begin +nvl(comm,) into yearSal fro ...
随机推荐
- ibatis 动态SQL
直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的字符串连接.对于这个问题,I ...
- ubuntu14.04修改mysql默认编码
修改文件为/etc/mysql/my.cnf [client] default-character-set = utf8 (ps:client的设置没变) [mysqld] lower_case_ta ...
- FZU——2111Min Number(多次交换得到最小数,水题)
Problem 2111 Min Number Accept: 760 Submit: 1516 Time Limit: 1000 mSec Memory Limit : 32768 KB ...
- BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】
题目 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; 输入格式 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; 输出格式 请你输出一个整数A=\sum ...
- jenkins配置发送邮件
1.打开系统管理->系统设置,找到邮件设置,如下: 2.SMTP或者其他方式的发送邮件,可自行配置,一下列出了qq邮箱和163邮箱设置的地方,如下图: qq邮箱: 往下拉,找到如下图: 163邮 ...
- 使用JWT实现Token认证
为什么使用JWT? 随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用 ...
- Nginx配置https双向认证
1. 前期的准备工作: 安装openssl和nginx的https模块 cd ~/ mkdir ssl cd ssl mkdir demoCA cd demoCA mkdir newcert ...
- 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...
- sqlite 使用
'''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说 没有独立的维护进程,所有的维护都来自于程序本身. 在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不 ...
- 我的logging 配置
#encoding=utf-8 import logging.config logging.config.dictConfig({ 'version': 1, 'disable_existing_lo ...