我有两个结构体(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之后,出错不知道是什么原因,哪位高手帮解答一下啊!!给个思路即可。
注:编译时没有任何问题或警告
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之后,出错不知道是什么原因,哪位高手帮解答一下啊!!给个思路即可。
注:编译时没有任何问题或警告
解决方案 »
- 使用Devpartner Bounder Checker 9.0.2编译错误
- 关于NetUserEnum的一些请教
- TAB控件下定义编辑框,程序调试对话框不出来
- VC 怎么实现修改文件中的中间一段字符串 不能用MFC
- 请问当bind,accept以后,程序怎样才知道当有连接时,调用recv来读取?
- 哪儿能知道 vc中工具栏内控件的基本操作,和能达到的效果?(比如CListBox)
- 如何用vc指定其他truetype字体显示text?
- 高分 请教ClistCtrl 问题
- 如何对交换机编程?需要技术方案
- MFC ActiveX控件(初学者)问题
- 显示button的问题
- 有代码,发现了一个链表遍历死循环的陷阱:对于那种链接信息和数据信息在一个结构体中的节点,如果链表保存了相同节点的指针,就会导致死
不过系统有些地方是使用的TCHAR!所以我又使用了T2A和CString来进行了转换!
如果改data[1]为data[1024]则没有任何问题!那么原问题是否是内存溢出或其他什么内存操作引起?又该如何解决呢?!
如果数据大小不好确定的话,先在结构体内定义指针char *data;
到用的时候再给data动态分配空间,注意最后释放就行了
data仅仅代表数据的首地址,上面还有一个参数unsigned short dataLength来确定数据的长度,因此,在使用时,同样可以得到完整的数据!
char data[1];
虽然data是代表首地址,但你仅仅分配了一个字节的空间.如果copy字符串超过一个字节就可能会引起内存访问非法.
你可以定义char *data;
在赋值前new,但一定要记得delete.
那就需要按我说的先定义指针char *data;
到用的时候:
....data = new char[dataLength+1];用完的时候delete ...[]data;
char *data;
在构造里
data=null;
在析构里
delete data;记得每次赋值前要delete一下,然后new一段你需要的空间.当然,更省事的方法是定义一个很大的足够使用的字符串,比如:
char data[1024];