user-0 提问: 怎样申请能够存放不同数据类型的大块内存空间？

回复:
user: user-0
content: 引用 24 楼 WUYUAN2011WOAINI 的回复:你 直接建个byte数组，把int什么的float什么的都 按内存拷贝方式拷进去，然后再拷出来  能否说更具体一点？有个例子最好。

user: user-1
content: 你 直接建个byte数组，把int什么的float什么的都 按内存拷贝方式拷进去，然后再拷出来

user: user-0
content: 佩服。 后来我想了一下，先用标识 和 数据分开存储的方法试试。 在一个内存块里折腾难度太大了。 感谢大家。

user: user-2
content: 美中不足 最后加一句：free(base);

user: user-2
content: 满足你：  #include <string.h> #include <stdio.h> typedef struct datainfo { 	unsigned int nNum;  //数据个数 	char type[10];      //数据类型 }DataInfo; void *base; void write() { 	//存数据 	void *p = base; 	*(int*)p = 2;   //前四个字节存放块数 	(char*)p += sizeof(int);  	DataInfo d1 = { 10, "int" }; 	memcpy(p, &d1, sizeof(d1)); 	(char*)p += sizeof(d1); 	int iarr[] = { 0,1,2,3,4,5,6,7,8,9 }; 	memcpy(p, iarr, sizeof(iarr)); 	(char*)p += sizeof(iarr);  	DataInfo d2 = { 10, "double" }; 	memcpy(p, &d2, sizeof(d2)); 	(char*)p += sizeof(d2); 	double darr[] = { 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1 }; 	memcpy(p, darr, sizeof(darr)); 	(char*)p += sizeof(darr); } void read() { 	//取数据 	void *p = base; 	int i = 0, n = *(int*)p; 	(char*)p += sizeof(int); 	while (i < n) 	{ 		DataInfo d = *(DataInfo*)p; 		printf("nNum=%d,type=%s\n", d.nNum, d.type); 		if (0 == strcmp(d.type, "int")) 		{ 			int *q = (char*)p + sizeof(DataInfo); 			int i; 			for (i = 0; i < d.nNum; i++, q++) printf("%d ", *q); 			p = q; 		} 		else if (0 == strcmp(d.type, "double")) 		{ 			double *q = (char*)p + sizeof(DataInfo); 			int i; 			for (i = 0; i < d.nNum; i++, q++) printf("%g ", *q); 			p = q; 		} 		else 		{ 			printf("Type error!\n"); 			return; 		} 		printf("\n"); 		i++; 	} } int main(void) { 	base = malloc(1024 * 1024);   //申请1M内存 	write(); 	read(); 	return 0; } //nNum = 10, type = int //0 1 2 3 4 5 6 7 8 9 //nNum = 10, type = double //0.1 1.1 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1

user: user-0
content: 引用 14 楼 Philipyexushen 的回复:[quote=引用 13 楼 guoyunfei1 的回复:] 我现在就是想解决标识的问题。 其实我要存储大量float 类型数据 到一个Buffer里。 需要同时存入一些int 类型，作为标识数据，用于读取数据时辨识这些不同数据。 不知这个思路对不对。  那为什么要一定要一次性的分配一片内存来做这件事情呢？  分两个区域，一个储存，一个是指向BUFFER的标识不是更好吗[/quote]   我的想法是这样的:  先开辟一大块内存空间，比如10M。 用  BuffBcrv = (float*)  malloc( 1024* 1024*10 ); // deploy memory of xxx size for store the result B curve  要存入的数据分为两种不同用途，希望能够读取时分辨出是哪一种。  问题1：  然后依次存入不同大小的数据块。 为了读取方便，在存入不同大小数据块之前，先存入该数据块的大小数值。  问题2： 要存入的数据分两种不同类型，为了区分这两种类型，需要设置类型标识。  请问大家，如何设定数据块的标识？

user: user-3
content: 引用 17 楼 zhangxiangDavaid 的回复:[quote=引用 16 楼 Philipyexushen 的回复:] [/code]  大神，我问个问题可以吗，为什么要写成12 & 0xffu和(12 >> 24) & 0xffu呢。。。。[/quote] 按每个字节取值[/quote]  懂了，谢谢

user: user-4
content: 楼主要的是 union 吧 如我想这块内存可以存  坐标 int x, y, z 色彩 char r, g, b, a 贴图 float u, v ..........   typedef union vec {   struct { 	int x, y, z;   };    struct { 	unsigned char r, g, b, a;   };    struct { 	float u, v;   }; } vec_t;

user: user-2
content: 引用 16 楼 Philipyexushen 的回复:[/code]  大神，我问个问题可以吗，为什么要写成12 & 0xffu和(12 >> 24) & 0xffu呢。。。。[/quote] 按每个字节取值

user: user-3
content: 引用 8 楼 zhangxiangDavaid 的回复:[quote=引用 7 楼 guoyunfei1 的回复:] 谢谢。 那请问如果让   //i=12 //f=12.340000 //lf=12.340000 //cs=David 这几个数据依次存入申请的Base, 怎么写代码？ 亲，一定得这样吗：  #include <memory.h> int main(void) { 	//申请10个字节的空间 	void *base = malloc(sizeof(char) * 10); 	((char*)base)[0] = 12 & 0xffu; 	((char*)base)[1] = (12 >> 8) & 0xffu; 	((char*)base)[2] = (12 >> 16) & 0xffu; 	((char*)base)[3] = (12 >> 24) & 0xffu; 	printf("i=%d\n", *(int*)base);  	float f = 12.34f; 	((char*)base)[0] = ((char*)&f)[0]; 	((char*)base)[1] = ((char*)&f)[1]; 	((char*)base)[2] = ((char*)&f)[2]; 	((char*)base)[3] = ((char*)&f)[3]; 	printf("f=%f\n", *(float*)base);  	double lf = 12.34; 	((char*)base)[0] = ((char*)&lf)[0]; 	((char*)base)[1] = ((char*)&lf)[1]; 	((char*)base)[2] = ((char*)&lf)[2]; 	((char*)base)[3] = ((char*)&lf)[3]; 	((char*)base)[4] = ((char*)&lf)[4]; 	((char*)base)[5] = ((char*)&lf)[5]; 	((char*)base)[6] = ((char*)&lf)[6]; 	((char*)base)[7] = ((char*)&lf)[7]; 	printf("lf=%lf\n", *(double*)base);  	char *cs = "David"; 	((char*)base)[0] = cs[0]; 	((char*)base)[1] = cs[1]; 	((char*)base)[2] = cs[2]; 	((char*)base)[3] = cs[3]; 	((char*)base)[4] = cs[4]; 	printf("cs=%s\n", cs);  	free(base); 	return 0; } [/quote]  大神，我问个问题可以吗，为什么要写成12 & 0xffu和(12 >> 24) & 0xffu呢。。。。

user: user-5
content: 这不就是结构体么...

user: user-3
content: 引用 13 楼 guoyunfei1 的回复:我现在就是想解决标识的问题。 其实我要存储大量float 类型数据 到一个Buffer里。 需要同时存入一些int 类型，作为标识数据，用于读取数据时辨识这些不同数据。 不知这个思路对不对。  那为什么要一定要一次性的分配一片内存来做这件事情呢？  分两个区域，一个储存，一个是指向BUFFER的标识不是更好吗

user: user-0
content: 我现在就是想解决标识的问题。 其实我要存储大量float 类型数据 到一个Buffer里。 需要同时存入一些int 类型，作为标识数据，用于读取数据时辨识这些不同数据。 不知这个思路对不对。

user: user-6
content: 引用 9 楼 guoyunfei1 的回复:高手。 您的功力确实了得。  不过抱歉我没把问题说清除， 我是想问，Base里面先放int 12,后面再添加进去float 12.34; 等等。 Base要大一点，里面同时放入不同类型的数据。 请问有没有办法实现？ 你需要的其实是一个可以存放任意类型的容器吧 这个当然是可以实现的，只是你得自己用一个标示来记录数据的类型，否则你取数据的时候是并不知道当前数据时什么类型的。 例如：    struct AnyData {      int m_datatype;        union      {            float m_floatval;            int    m_intval;      }; };  struct AnyData* base = (struct AnyData*)malloc(sizeof(AnyData) * N);

user: user-0
content: 我也在想，怎么能让这些不同类型数据挨着存储。 尽量少浪费内存空间。

user: user-2
content: 引用 9 楼 guoyunfei1 的回复:高手。 您的功力确实了得。  不过抱歉我没把问题说清除， 我是想问，Base里面先放int 12,后面再添加进去float 12.34; 等等。 Base要大一点，里面同时放入不同类型的数据。 请问有没有办法实现？ 是要连续存放吗？否则会覆盖掉

user: user-0
content: 高手。 您的功力确实了得。  不过抱歉我没把问题说清除， 我是想问，Base里面先放int 12,后面再添加进去float 12.34; 等等。 Base要大一点，里面同时放入不同类型的数据。 请问有没有办法实现？

user: user-2
content: 引用 7 楼 guoyunfei1 的回复:谢谢。 那请问如果让   //i=12 //f=12.340000 //lf=12.340000 //cs=David 这几个数据依次存入申请的Base, 怎么写代码？ 亲，一定得这样吗：  #include <memory.h> int main(void) { 	//申请10个字节的空间 	void *base = malloc(sizeof(char) * 10); 	((char*)base)[0] = 12 & 0xffu; 	((char*)base)[1] = (12 >> 8) & 0xffu; 	((char*)base)[2] = (12 >> 16) & 0xffu; 	((char*)base)[3] = (12 >> 24) & 0xffu; 	printf("i=%d\n", *(int*)base);  	float f = 12.34f; 	((char*)base)[0] = ((char*)&f)[0]; 	((char*)base)[1] = ((char*)&f)[1]; 	((char*)base)[2] = ((char*)&f)[2]; 	((char*)base)[3] = ((char*)&f)[3]; 	printf("f=%f\n", *(float*)base);  	double lf = 12.34; 	((char*)base)[0] = ((char*)&lf)[0]; 	((char*)base)[1] = ((char*)&lf)[1]; 	((char*)base)[2] = ((char*)&lf)[2]; 	((char*)base)[3] = ((char*)&lf)[3]; 	((char*)base)[4] = ((char*)&lf)[4]; 	((char*)base)[5] = ((char*)&lf)[5]; 	((char*)base)[6] = ((char*)&lf)[6]; 	((char*)base)[7] = ((char*)&lf)[7]; 	printf("lf=%lf\n", *(double*)base);  	char *cs = "David"; 	((char*)base)[0] = cs[0]; 	((char*)base)[1] = cs[1]; 	((char*)base)[2] = cs[2]; 	((char*)base)[3] = cs[3]; 	((char*)base)[4] = cs[4]; 	printf("cs=%s\n", cs);  	free(base); 	return 0; }

user: user-0
content: 谢谢。 那请问如果让   //i=12 //f=12.340000 //lf=12.340000 //cs=David 这几个数据依次存入申请的Base, 怎么写代码？

user: user-7
content: assert(sizeof(int)==sizeof(float));