戻ってきた値を、
CString型に変換しようと考えています。
それで以下のようなコードを作成したのですが、
5行目のcsTxt=*pでこけてしまいます。
このコーディングの問題点を教えてください。
01行目:main(){
02行目: char* p
03行目: createStr(p)
04行目: CString csTxt;
05行目: csTxt=*p;
06行目: delete p
07行目:}
08行目:
09行目:void createStr(char* result){
10行目:
11行目: CString csfile;
12行目: csfile="Sample";
13行目: result = (char*)malloc(csfile);
14行目: strcpy(result,csfile);
15行目:}
createStrは実装者の意図としては内部で確保した領域のポインタを取得したいのでしょうからこのままではダメです。
このままでは呼び出し側でchar*の値は変わりませんから。
解決策1・ポインタを参照渡しにする
09行目を
void createStr(char*& result){
こうして参照渡しにすればいけると思います。
解決策2・ポインタのポインタを渡す
createStrの実装を
void createStr(char** result){
CString csfile;
csfile="Sample";
*result = (char*)malloc(csfile.GetLength());
strcpy(*result,csfile);
}
こうして
createStr( &p );
と呼び出すといけると思います。
URLはダミーです
MFC はよく分かりませんが、
http://www.gcc.ne.jp/~narita/soft/lib/CString/reference/index.ht...
CString& operator = ( const CString& s );
CString& operator = ( LPCSTR lpsz );
とあるので、ポインタのまま
csTxt = p ;
ではどうですか。
以下のようなメッセージがでて落ちました。サンプルをより実コーディングに近いものにします
Dumping objects ->
{160} normal block at 0x00AB2D10, 1 bytes long.
Data: < > 00
{159} normal block at 0x00AB2E70, 1 bytes long.
Data: < > 00
strcore.cpp(118) : {152} normal block at 0x00AB2590, 126 bytes long.
Data: < S q L:\ > 01 00 00 00 53 00 00 00 71 00 00 00 4C 3A 5C 83
strcore.cpp(118) : {147} normal block at 0x00AB2A40, 20 bytes long.
Data: < defa> 01 00 00 00 07 00 00 00 07 00 00 00 64 65 66 61
strcore.cpp(118) : {146} normal block at 0x00AB2A80, 23 bytes long.
Data: < Samp> 01 00 00 00 0A 00 00 00 0A 00 00 00 53 61 6D 70
createStrは実装者の意図としては内部で確保した領域のポインタを取得したいのでしょうからこのままではダメです。
このままでは呼び出し側でchar*の値は変わりませんから。
解決策1・ポインタを参照渡しにする
09行目を
void createStr(char*& result){
こうして参照渡しにすればいけると思います。
解決策2・ポインタのポインタを渡す
createStrの実装を
void createStr(char** result){
CString csfile;
csfile="Sample";
*result = (char*)malloc(csfile.GetLength());
strcpy(*result,csfile);
}
こうして
createStr( &p );
と呼び出すといけると思います。
URLはダミーです
これです。解決策2をとりました。ポインタを参照渡しする方法もあるんですね。
これです。解決策2をとりました。ポインタを参照渡しする方法もあるんですね。