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

解決済みの質問

メモリ動的確保について

こんにちはです。
メモリの動的確保なのですが、
typedef struct DATA{
char name[256];
char pass[256];
int money;
}BANK;
void insert(BANK *p,int max);
int main(){
int i;
size_t st;
BANK *person;
person = (struct DATA *)malloc(sizeof(struct DATA));
//person = (struct DATA *)malloc(5);
if(person == NULL){
printf("確保失敗\n");
exit(-1);
}
//memset(person,'\0',sizeof(struct DATA));
と、言う風に、記載ソースは途中ですがメモリをとりました。
mallocの後ろの部分ですが、sizeof(struct DATA)と5ではどうちがうのでしょう??2通りともコンパイルエラーはないです。
5は動的に最大5までとるって事はわかるのですが、struct DATAの方はいくつとるのです??いくつもで入力次第です?
そして、動的したのにたいしてmemsetしたら実行エラー(コンパイルは通りました)おきました。動的にたいしてmemはダメなのでしょうか?
アドバイスいただけたらありがたいです。宜しくお願いいたします。

投稿日時 - 2006-12-19 15:10:47

QNo.2612388

すぐに回答ほしいです

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

★アドバイス
・『sizeof(struct DATA)』は、構造体『struct DATA』の1個分のサイズのことです。
・『5』は、最大5個ではなく、5 バイトだけ確保することになります。→サイズが足りません。危険です。
・よって、5個分のメモリを確保する場合は、『sizeof(struct DATA) * 5』と掛け算をします。
・動的確保したメモリでも、『memset』は使えますが、サイズ指定を気をつけましょう。
・つまり、memset( person, '\0', (sizeof(struct DATA) * 5) ); とするのです。掛け算をするのですよ。

補足:
・2通りともコンパイル・エラーにはなりません。ただし、実行したときに『ハングアップ』しますよ。
・両方とも文法エラーではないためエラーにならないのですよ。でも、『5』の場合は正常に実行できません。
・とにかく『malloc』は指定バイト数の動的確保ですので、配列の場合は『型』のサイズと配列の個数を
 掛け算したバイト数を指定するわけです。→例:int型の10コの配列は、sizeof(int) * 10 と指定するわけだ。
・『memset』のサイズ指定も同じで掛け算したバイト数を指定します。
・分かりますか?
・以上、おわり。

投稿日時 - 2006-12-19 15:30:08

お礼

お返事ありがとうございます。
なんて分かりやすい説明でしょう。
本当にありがとうございます。
今callocとreallocも調べています。
もし、使い方に疑問とかあやまりとかありましたら、またご指導いただけたらうれしです。
少し調べてからわからなかったらお尋ねします。
ありがとうございました。

投稿日時 - 2006-12-19 17:15:47

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

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

回答(1)