こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c言語 構造体

初歩の質問ですがお手柔らかに…
ポインタもまだ理解しきれていません。
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" とすると、問題なく文字列を代入できました。


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

投稿日時 - 2012-04-03 02:10:49

QNo.7399230

困ってます

質問者が選んだベストアンサー

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

ところで、data自体のmallocはやってますよね?

投稿日時 - 2012-04-03 02:28:34

お礼

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

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

投稿日時 - 2012-04-03 09:54:33

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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

投稿日時 - 2012-04-03 12:25:29

補足

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

投稿日時 - 2012-04-03 18:04:30

お礼

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

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

投稿日時 - 2012-04-03 18:10:00

ANo.3

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

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

ご参考まで

投稿日時 - 2012-04-03 11:04:20

お礼

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

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

投稿日時 - 2012-04-03 17:44:08

ANo.2

> 初歩の質問ですがお手柔らかに…
> ポインタもまだ理解しきれていません。

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

そうしないと、これからもたびたび質問しないとならない状況になりますよ。

投稿日時 - 2012-04-03 07:44:12

お礼

おっしゃる通りです…

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

投稿日時 - 2012-04-03 09:57:30