今天被兩個問題折騰了好久,一個是關於結構體數組傳遞值的問題,就是不知道結構體指針傳遞形參到子函數後,如何被子函數分解並繼續使用,測試過程中老是只能在結構體數組的第一個元素進行操作,後面的操作就會提示“訪問越界”之類的提示,真是傷透了腦筋。
第二個問題是關於遇到結構體數組不知道如何直接進行傳遞值的問題,我思考了很久,也查閱了不少資料,終於找到了下面一條比較麻煩的方法,不過測試基本可行,先貼上代碼:
#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);
當然,這只是我此時實驗出的方法之一,並不代表唯一,希望讀者能自我挖掘。