環境VC++6 関数の中でcharのエリア確保・文字列設定を行い、

戻ってきた値を、
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行目:}

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/10/26 22:37:51
  • 終了:2008/10/30 02:23:10

ベストアンサー

id:yo-kun No.3

yo-kun回答回数220ベストアンサー獲得回数302008/10/26 23:38:54

ポイント100pt

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はダミーです

http://q.hatena.ne.jp/answer

id:harunoharuno

これです。解決策2をとりました。ポインタを参照渡しする方法もあるんですね。

2008/10/27 09:14:36

その他の回答(2件)

id:GoldenDawn No.1

GoldenDawn回答回数426ベストアンサー獲得回数812008/10/26 22:53:51

ポイント27pt

MFC はよく分かりませんが、

http://www.gcc.ne.jp/~narita/soft/lib/CString/reference/index.ht...

CString& operator = ( const CString& s );

CString& operator = ( LPCSTR lpsz );

とあるので、ポインタのまま

csTxt = p ;

ではどうですか。

id:harunoharuno

以下のようなメッセージがでて落ちました。サンプルをより実コーディングに近いものにします

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

2008/10/26 23:17:38
id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812008/10/26 23:34:08

ポイント27pt
result = (char*)malloc(csfile.Len()) ;

では?


http://q.hatena.ne.jp/

id:yo-kun No.3

yo-kun回答回数220ベストアンサー獲得回数302008/10/26 23:38:54ここでベストアンサー

ポイント100pt

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はダミーです

http://q.hatena.ne.jp/answer

id:harunoharuno

これです。解決策2をとりました。ポインタを参照渡しする方法もあるんですね。

2008/10/27 09:14:36
  • id:yo-kun
    回答に書き忘れましたが
    mallocで確保した領域はfreeで開放してください。
    deleteはnewで確保した領域を開放する手段です。
  • id:harunoharuno
    >>yo-kunさん
    丁寧にどうもありがとうございます。
    お蔭様でスパゲッティーを
    簡単な関数でまとめ見やすくすることができました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません