您的位置:首页 > 其它

关于MFC中CString的用法小结

2015-08-17 17:19 477 查看
今天被两个问题折腾了好久,一个是关于结构体数组传递值的问题,就是不知道结构体指针传递形参到子函数后,如何被子函数分解并继续使用,测试过程中老是只能在结构体数组的第一个元素进行操作,后面的操作就会提示“访问越界”之类的提示,真是伤透了脑筋。

第二个问题是关于遇到结构体数组不知道如何直接进行传递值的问题,我思考了很久,也查阅了不少资料,终于找到了下面一条比较麻烦的方法,不过测试基本可行,先贴上代码:

#include <afx.h>
#include <iostream>
using namespace std;

typedef struct
{
CString ni;
CString bi;
}MyStruct,s123;

LPBYTE getInfo()
{

CString mt = L"nihao";
WCHAR *tmep = (WCHAR*)malloc(100);
LPBYTE tem123 = (LPBYTE)tmep;
wsprintf((WCHAR*)tmep, L"%s", mt.GetBuffer());
tmep += (mt.GetLength()+1);
wsprintf((WCHAR*)tmep, L"%s", mt.GetBuffer());
return tem123;
}
void main()
{
DWORD nih = sizeof(MyStruct);
LPBYTE ni = getInfo();
wcout << (WCHAR*)ni << endl;
DWORD temp1 = (wcslen((wchar_t*)ni) + 1)*sizeof(WCHAR);
wcout << (WCHAR*)(ni + temp1) << endl;

MyStruct me;
me.ni = (WCHAR*)ni;
me.bi = (WCHAR*)(ni + temp1);
}
上面这个程序的大致作用如下:

1、测试CString数组自身在分配时是否会默认在字符串末尾加上'\0',这样以方便sprintf函数能够将很多字符串格式化到一个分配好的地址空间里。

2、测试指针返回问题和局部变量的生命周期,经测试发现在子函数中用如下方式定义变量时,在函数返回后内存会被销毁。

CString mt = L"nihao";
而用下面方式定义变量时,函数返回时变量会被销毁,但地址空间内的数据不会被销毁,这就能被我们在返回主调函数地址时使用。

WCHAR *tmep = (WCHAR*)malloc(100);


当然,按照传统方式,例如下面用指针作为形参传递并在子函数赋值的方式也是可行的:

LPBYTE getInfo(DWORD *am)
{
DWORD ba = 2;
*am = ba;
}
void main()
{
DWORD i = 0;
getInfo(&i);
}


3、测试获取的字符串如何赋值给CString类型,证明如下方式可行:

MyStruct me;
me.ni = (WCHAR*)ni;
me.bi = (WCHAR*)(ni + temp1);


当然,这只是我此时实验出的方法之一,并不代表唯一,希望读者能自我挖掘。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CString 形参传递