C++2010 .net字符串String^转Char[]数组的有关问题,数组赋值总是从下标4开始

C++2010 .net字符串String^转Char[]数组的问题,数组赋值总是从下标4开始
由于本人初学C++,原先学习的是C#,想利用.net 环境开发,最近遇到一个很神奇的问题:
C++2010 .net字符串String^转Char[]数组的有关问题,数组赋值总是从下标4开始
我在页面头部定义了一个结构体
typedef struct infor_field
{
char  rope_type[20];                   //被测钢丝绳型号           变长
char  working_spot[40];                //工作地点                 变长
char  device_name[40];                 //检测设备名称   变长
char  woking_time1[20];                //采样年月日   变长                     
char  woking_time2[20];                //采样时分秒   变长
char  soft_ver[20];                    //软件版本   变长
unsigned char  working_step;             //采样步长                 1个字节
float   Ch1_Adjust;  //通道一零点                4个字节
float   Ch2_Adjust;  //通道二零点  4个字节
float   Ch3_Adjust;  //通道三零点  4个字节
float   Ch4_Adjust;  //通道四零点  4个字节
float   rope_speed;                  //绳运动速度           4个字节
}INFOR_FIELD;

然后是声明:
INFOR_FIELD g_Dat_head;//文件头

然后在namespace中取得控件的文本,其中strRopeType是namespace中的全局变量,cbbRopeType是下拉框
strRopeType=cbbRopeType->Text;//赋值

然后我想把文本赋值给g_Dat_head.rope_type
char charTemp;
for (int i=0;i<strRopeType->Length;i++)
{//没办法,只能自己手动转换Char数组和字符串
//这里有个很神奇的调试器bug,g_Dat_head.rope_type[i]是从i=4开始赋值的,搞不懂
charTemp=strRopeType->ToCharArray()[i];
g_Dat_head.rope_type[i]=charTemp;
}

调试的时候发现很多问题,首先是结构体的初始化,rope_type自带乱码:
C++2010 .net字符串String^转Char[]数组的有关问题,数组赋值总是从下标4开始
strRopeType的值:
C++2010 .net字符串String^转Char[]数组的有关问题,数组赋值总是从下标4开始
执行几步之后,发现g_Dat_head.rope_type是从下标4开始赋值的,还有g_Dat_head中的其他字符数组都是这样的情况。请教各位前辈指点,感激不尽!
C++2010 .net字符串String^转Char[]数组的有关问题,数组赋值总是从下标4开始
注:进入调试模式,选择即时窗口,在即时窗口中输入代码是能够正确赋值的:
C++2010 .net字符串String^转Char[]数组的有关问题,数组赋值总是从下标4开始
------解决思路----------------------
从控件中获得的一般都是CString类型,从CString类型转换到char数组需要区分你的程序使用的字符集是UNICODE还是多字节,具体转换在网上搜索下CString char转换即可。结构体使用前先初始化下试试。

------解决思路----------------------
要用[StructLayoutAttribute(LayoutKind.Sequential)]让结构体对齐。
------解决思路----------------------
为了提高效率,C中的结构默认是按int对齐,也就是4个字节,每一个变量的起始点在4的倍数上,变量后面会有一些空余的内存,如果想按字节对齐,要设置对应的参数,具体设什么不记得了,搜一下c语言内存对齐就有。