dポイントプレゼントキャンペーン実施中!

初歩の質問ですがお手柔らかに…
ポインタもまだ理解しきれていません。
winapiの勉強しながらプログラムを作っています。
windows7,VisualStudio2010使用です。

struct A{
char *name;
double i;
} *data;//これはグローバル変数にしてあります。
(中略)
(以下ダイアログプロシージャ内)
TCHAR Buf[128];
GetDlgItemText(hDlg, IDC_XXXXX,Buf,(int)sizeof(Buf) -1);

ここから、構造体AのメンバnameにBufの内容をコピーしたいのですが、この後を
data->name = Buf ;
とすると、nameのポインタがBufと同じものになり、Bufはローカル変数なのでこの関数が終わるとこのアドレスの値はめちゃくちゃになるのでnameを別の関数内では参照できなくなりました。

&(data->name) = 00C09814  
&(Buf) = 002EF590

&(data->name) = 002EF590
&(Buf) = 002EF590
として参照できるようにするのではなく、

アドレス 00C09814に アドレス002EF590の文字をコピーしてdata->nameとBufを別のアドレスで内容が同じものにしたいのです。
*(data->name + i) =*(Buf +i)をループで回してもうまくいかず、
sprintf() や strcpy() も試したのですが、コンパイルはできてもどこか不具合があるらしく、アプリケーションを動かすとこの部分で動作を停止してしまいます。
この場所で data->name = "text" とすると、問題なく文字列を代入できました。


わけのわからないことを言っている部分もありますが、どなたかご教授お願いします。

A 回答 (4件)

if(data->name!=NULL)free(data->name);


data->name=calloc(data->name, strlen(Buf) + 1, sizeof(char));
strcpy(data->name, Buf);

ところで、data自体のmallocはやってますよね?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
構造体自体のmallocはしています。

コピーする前に領域を確保しなくてはいけなかったのですね。

お礼日時:2012/04/03 09:54

calloc じゃなくて malloc で十分だと思うし, その前の free も「NULL かどうかの判定」は不要だと思うの>#

1.

この回答への補足

自分のプログラムではmallocで大丈夫でした。

補足日時:2012/04/03 18:04
    • good
    • 0
この回答へのお礼

ありがとうございました。

最小限のプログラムで無駄なく書けるようになりたいです。

お礼日時:2012/04/03 18:10

原因はきちんと整理できています。


ポインター変数を使うときはいろいろと注意が必要ですが、今回の場合は
単純に構造体を実態として定義すれば事足りると思います。

struct A{
fixed char name[128];
double i;
}

ご参考まで
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

何とか目的のことはできました。

お礼日時:2012/04/03 17:44

> 初歩の質問ですがお手柔らかに…


> ポインタもまだ理解しきれていません。

それなら、まずポインタ(および、動的なメモリの確保と解放)の勉強を徹底的にやりましょう。
ポインタだけに絞った参考書とかもあります。

そうしないと、これからもたびたび質問しないとならない状況になりますよ。
    • good
    • 0
この回答へのお礼

おっしゃる通りです…

ポインタだけの参考書はもっておりまして参考にしながら作っています。

お礼日時:2012/04/03 09:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!