C99_变长结构体实现

/*************************************************************************
    > File Name: C99_lengthenStruct.c
    > Author: zshh0604
    > Mail: [email protected]
    > 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
				
时间: 2024-10-21 12:14:32

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

变长结构体的使用

在分析安卓源码过程中看到几处使用变长结构体的例子,比如下面的结构体: struct command { /* list of commands in an action */ struct listnode clist; int (*func)(int nargs, char **args); int nargs; char *args[1]; }; 下面介绍安卓是如何使用这个结构的,在解析init.rc文件的过程中,会使用这个结构体记录某些命令. static void parse_line_

C语言结构体(struct)常见使用方法(转)

本文转自 CSDN huqinweI987 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 [cpp] view plaincopy struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp] view plaincopy

C语言结构体(struct)常见使用方法

基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 [cpp] view plain copy struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp] view plain copy //直接带变量名Huqinwei st

strcut的用法--------C语言结构体(struct)常见使用方法(转载)

今天复习一下struct,顺便挖掘一下以前没注意的小细节: 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 [cpp] view plain copy struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的"结构体变量"的初始化的结构体定义 [cpp] 

类和结构体

//类  class A {     var a = 0 } let classA = A() classA.a = 12     //虽然classA定义为常量,但是仍然可以修改A类中的变量值;结构体则不可以 //类属于引用类型,结构体属于值类型

2016年10月19日--传值、传址、结构体

传值---传址 传值:将变量名中存放的值进行传输 private void 传值(int a) { a += 10; } static void Main(string[] args) { //实例化 初始化 这个类 Program hs = new Program(); int a = 0; hs.传值(a);//a不变 } 格式 传址:将这个变量名直接传输过去,若在另一边有赋值情况,这边的值会发生变化 private void 传址(int a, out int b) { b = a + 1

C——结构体总结

结构体定义和结构体变量的声明 方式一: 定义,初始化结构体变量分开 struct Student { char name[10]; char age; }; struct Student stu; 方式二: 附加结构体变量初始化 struct Student { char name[10]; char age; }stu; 方式三: struct { char name[10]; char age; }stu; 把结构体名称去掉,这样更简洁,不过也不能定义其他同结构体变量了. 结构体内部成员变量

C 语言变长数组 struct 中 char data[0] 的用法

1.结构体内存布局(padding) 为了让CPU能够更舒服地访问到变量,struct中的各成员变量的存储地址有一套对齐的机制.这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足:第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充. The following typical alignments are va

结构体的转换

值对象(value object)概念 在面向对象的编程语言中,值对象本质上是数据元素的的对象包装器,所谓数据元素,常见的包含string,number,date类型以及其它自定义的结构体类型.Objective-C语言本身提供了string,number,date相对应的包装类,分别是NSString,NSNumber,NSDate,这些类创建的对象都可以称为值对象.但值对象本身的范围更加广泛,它可以是任何自定义类型创建的对象. 值对象作用 C语言提供了char/int/float/doubl