1. 程式人生 > >關於MFC中CString的用法小結

關於MFC中CString的用法小結

今天被兩個問題折騰了好久,一個是關於結構體陣列傳遞值的問題,就是不知道結構體指標傳遞形參到子函式後,如何被子函式分解並繼續使用,測試過程中老是隻能在結構體陣列的第一個元素進行操作,後面的操作就會提示“訪問越界”之類的提示,真是傷透了腦筋。

第二個問題是關於遇到結構體陣列不知道如何直接進行傳遞值的問題,我思考了很久,也查閱了不少資料,終於找到了下面一條比較麻煩的方法,不過測試基本可行,先貼上程式碼:

#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);

當然,這只是我此時實驗出的方法之一,並不代表唯一,希望讀者能自我挖掘。