我有两个结构体(UNICODE环境下):
struct SMS_STRUCT{
char Sender[40];
char SmsSender[40];
char SmsInfo[160];
unsigned short datalen;
char Recver[1];
};#pragma pack (1)  
typedef struct _SMS_DATA{
char protocol;//
int sequence; //
char type; //
char channel;//
unsigned short dataLength; //
char data[1]; //
         _SMS_STRUCT(){
           //初始化代码略
         }

void IniSendData(const SMS_STRUCT& obj)
{
CString SmsMsg(obj.SmsInfo);
USES_CONVERSION;
memcpy(data,T2A((LPCTSTR)SmsMsg),strlen(T2A((LPCTSTR)SmsMsg)));//把该句注释掉后没有错误
// strcpy(data,T2A((LPCTSTR)SmsMsg));//如果把上面的memcpy换成,该句,出现同样的问题
dataLength = strlen(T2A((LPCTSTR)SmsMsg));
}

}_SMSDATA_SEND;
他们的调用方法如下:SMS_STRUCT m_rtxSms;
//给m_rtxSms赋值
USES_CONVERSION;
strcpy(m_rtxSms.Sender,T2A((LPCTSTR)CString(szSender)));
strcpy(m_rtxSms.SmsInfo,T2A((LPCTSTR)CString(szMsg)));
//均类似,余下的略_SMSDATA_SEND obj;
obj.IniSendData(m_rtxSms);
return;
//执行完return之后,出错不知道是什么原因,哪位高手帮解答一下啊!!给个思路即可。
注:编译时没有任何问题或警告

解决方案 »

  1.   

    unicode环境下,最好用TCHAR 代替charstrcpy -> _tcscpy
      

  2.   

    为了和其他系统对接,_SMS_DATA的结构不能变化,只有使用char!
    不过系统有些地方是使用的TCHAR!所以我又使用了T2A和CString来进行了转换!
      

  3.   

    进一步实验发现:
    如果改data[1]为data[1024]则没有任何问题!那么原问题是否是内存溢出或其他什么内存操作引起?又该如何解决呢?!
      

  4.   

    memcpy(data,T2A((LPCTSTR)SmsMsg),strlen(T2A((LPCTSTR)SmsMsg)));//把该句注释掉后没有错data哪儿来的。。
      

  5.   

    char data[1]; 定义这么点大的数组空间 ?? 
    如果数据大小不好确定的话,先在结构体内定义指针char *data;
    到用的时候再给data动态分配空间,注意最后释放就行了
      

  6.   

    确实是空间不够引起,但是否可以这么理解:
    data仅仅代表数据的首地址,上面还有一个参数unsigned short dataLength来确定数据的长度,因此,在使用时,同样可以得到完整的数据!
      

  7.   

    不能这样理解.
    char data[1];
    虽然data是代表首地址,但你仅仅分配了一个字节的空间.如果copy字符串超过一个字节就可能会引起内存访问非法.
    你可以定义char *data;
    在赋值前new,但一定要记得delete.
      

  8.   

    char data[1]; 是在栈上分配的空间,其数组大小必须指定常量,变量的话
    那就需要按我说的先定义指针char *data;
    到用的时候:
    ....data = new char[dataLength+1];用完的时候delete ...[]data;
      

  9.   

    可以这样
    char *data;
    在构造里
    data=null;
    在析构里
    delete data;记得每次赋值前要delete一下,然后new一段你需要的空间.当然,更省事的方法是定义一个很大的足够使用的字符串,比如:
    char data[1024];
      

  10.   

    对, data是复制数据起始地址,memcpy最后的参数以char为单位指示要复制的数据长度