# aardio 范例: 调用 C 语言之弹性数组



```aardio
//aardio 调用 C 语言之弹性数组 
import tcc; 
tcc.build( "/.flexible_array.dll").code = /** 
#include <stdlib.h>
#include <string.h>

typedef struct{
	int length;
	char bytes[];
} TestStruct;

__declspec(dllexport) TestStruct* createTestStruct(){ 
	TestStruct *ts = (TestStruct *) malloc (sizeof (TestStruct) + 100);
	ts->length = strlen("测试一下");
	strcpy(ts->bytes, "测试一下");
	return ts;
}

__declspec(dllexport) void freeTestStruct(TestStruct* p){
	free(p);
} 
**/

//加载生成的DLL
var dll = raw.loadDll( "/.flexible_array.dll",,"cdecl" );

//方法1
var pStruct = dll.createTestStructP();

	//首先得到弹性数组的长度
	var length = raw.convert(pStruct,{int length}).length;
	
	//获取弹性数组
	var struct = raw.convert(pStruct,{
		BYTE bytes[/*不能指定变量值*/] = [
			length:length; //弹性数组的长度必须用 length 属性指定
		]
	},4/*raw.sizeof("int")*/); 
	
	print( string.pack( struct.bytes ) );
	
	// 也可以这样写
	// struct = raw.convert( pStruct, raw.array(length,"BYTE","bytes"),4/*raw.sizeof("int")*/ )

	// 或者这样写
	// var bytes = raw.convertArray(pStruct,length,"BYTE",4/*raw.sizeof("int")*/);
	
	//也可以直接计算指针地址，直接获取数据
	var offset = raw.sizeof({int length});
	var str = raw.tostring(pStruct,offset+1,offset + length);   
	print(str);

dll.freeTestStruct(pStruct);
	
```

