user-0 提问: 如何将结构体转化为char数组

回复:
user: user-1
content: 引用 8 楼 mgy4938 的回复:用memset就可以了。  请问memset怎么用呢？

user: user-0
content: 引用 11 楼 z1179675084 的回复:楼主C#我不懂，但是我知道fun（char* p）内部无论做了什么，都不会改变p的本质，因为这里只是个形参，所以不管你在函数内部怎么捣鼓，你的要求“我希望在c#项目调用fun（char* p）后，对数组p进行操作。”都不可能实现，除非使用二级指针！  是我2了，忘了是值传递这回事了。 我直接将地址以引用传值出来就ok了

user: user-2
content: 引用 12 楼 z1179675084 的回复: #include <stdio.h> typedef struct Tset  { 	char a; 	char b; }test;  int main() { 	test temp; 	test array[3] = {{'1','2'},{'3','4'},{'5','6'}}; 	test *p1 = array; 	int i; 	//不转换直接访问  	for(i = 0;i < 3;i++) 	{ 		printf("%c\n",p1->a); 		printf("%c\n",p1->b); 		p1++; 	} 	printf("\n"); 	//不转换利用数组访问  	p1 = array; 	for(i = 0;i < 3;i++) 	{ 		printf("%c\n",p1[i].a); 		printf("%c\n",p1[i].b); 	} 	 	char *p2 = (char *)array; 	printf("\n"); 	//转换利用指针访问  	for(i = 0;i < 6;i++) 	{ 		printf("%c\n",*p2++); 	} 	 	//转换通过数组访问  	p2 = (char *)array; 	printf("\n"); 	for(i = 0;i < 6;i++) 	{ 		printf("%c\n",p2[i]); 	} 	return 0; }   这种东西有个前提是你得清楚的知道里面存储的数据类型，内存分布。不然很危险

user: user-2
content: #include <stdio.h> typedef struct Tset  { 	char a; 	char b; }test;  int main() { 	test temp; 	test array[3] = {{'1','2'},{'3','4'},{'5','6'}}; 	test *p1 = array; 	int i; 	//不转换直接访问  	for(i = 0;i < 3;i++) 	{ 		printf("%c\n",p1->a); 		printf("%c\n",p1->b); 		p1++; 	} 	printf("\n"); 	//不转换利用数组访问  	p1 = array; 	for(i = 0;i < 3;i++) 	{ 		printf("%c\n",p1[i].a); 		printf("%c\n",p1[i].b); 	} 	 	char *p2 = (char *)array; 	printf("\n"); 	//转换利用指针访问  	for(i = 0;i < 6;i++) 	{ 		printf("%c\n",*p2++); 	} 	 	//转换通过数组访问  	p2 = (char *)array; 	printf("\n"); 	for(i = 0;i < 6;i++) 	{ 		printf("%c\n",p2[i]); 	} 	return 0; }

user: user-2
content: 楼主C#我不懂，但是我知道fun（char* p）内部无论做了什么，都不会改变p的本质，因为这里只是个形参，所以不管你在函数内部怎么捣鼓，你的要求“我希望在c#项目调用fun（char* p）后，对数组p进行操作。”都不可能实现，除非使用二级指针！

user: user-3
content: char *chBuf = NULL; chBuf = new char[nLenth]; memmove(chBuf,&Struct,sizeof(Struct));

user: user-4
content: 强转有风险，使用要谨慎

user: user-3
content: 用memset就可以了。

user: user-5
content: 引用 5 楼 WhiteBird99 的回复:强制类型转换, 同2楼 不过调用者要知道结构体大小吧, 不然怎么取数据...  调试不了是什么意思? 提供两种调试方法: 1. 将dll工程加入到C#的解决方案中 2. 将dll工程设置为指定程序启动时自动启动  还要知道struct 中因对齐填充的byte

user: user-0
content: 引用 5 楼 WhiteBird99 的回复:强制类型转换, 同2楼 不过调用者要知道结构体大小吧, 不然怎么取数据...  调试不了是什么意思? 提供两种调试方法: 1. 将dll工程加入到C#的解决方案中 2. 将dll工程设置为指定程序启动时自动启动  我使用的sizeof，maolloc等对数组赋值的  1、我的dll就是和c#的工程在同一个解决方案中 2、我将c#设置为允许调试费托管代码， 3、将C++设置为混合调试  运行之后就卡住了，显示一直处于加载系统的dll，估计等2小时也加载不好  你说的方式我没太懂

user: user-6
content: 强制类型转换, 同2楼 不过调用者要知道结构体大小吧, 不然怎么取数据...  调试不了是什么意思? 提供两种调试方法: 1. 将dll工程加入到C#的解决方案中 2. 将dll工程设置为指定程序启动时自动启动

user: user-7
content: 用vs打开dll的工程，attach到运行的主程序上去就能调试dll了

user: user-0
content: 引用 1 楼 u011779875 的回复:个人意见 仅供参考 例如 struct person{     char name[SIZE];     unsigned short age;     char address[MAX];     char job[SIZE]; };  struct person TMD; 用sprintf  这个函数 实现 它很强大的 sprintf(buf,"%s %d %s %s",TMD.name,TMD.age,TMD.address,TMD.job) 结构体太复杂，这样转换写代码太累    引用 2 楼 falcomavin 的回复:指针类型总是可以转换的，假设有结构体st，则 char *p = (char *)&st; 感觉这样可以，但是我的dll调试不了不知道什么原因

user: user-7
content: 指针类型总是可以转换的，假设有结构体st，则 char *p = (char *)&st;

user: user-8
content: 个人意见 仅供参考 例如 struct person{     char name[SIZE];     unsigned short age;     char address[MAX];     char job[SIZE]; };  struct person TMD; 用sprintf  这个函数 实现 它很强大的 sprintf(buf,"%s %d %s %s",TMD.name,TMD.age,TMD.address,TMD.job)