みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

LPSTR型の初期化について

memset関数で、初期化しようとしたら、警告メッセージが出ます。
警告が出ない方法を教えて下さい。

以下の処理の場合に警告が発生します。
LPSTR i;
unsigned long j;
j=100;
(void)memset( i, NULL, j);

投稿日時 - 2006-11-04 11:04:37

QNo.2516895

困ってます

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

どのメモリを初期化したいのでしょう?

iが未初期化(iにポインタ、つまりメモリアドレスを代入していない)な為、コンパイラは
「定義されただけで一度も代入が行われていない変数が参照されているぞ」
と警告しています。

普通、
typedef char CHAR;
typedef CHAR *LPSTR;
と定義されています。従って
char *i;
unsigned long j;
j=100;
(void)memset( i, NULL, j); //この時点では「i」は不定
と書くのと同じです。

このプログラムを実行すると、iは何になっているか判らないので、実行時に暴走したり、一般保護例外が発生します。

動的にメモリを確保するなら、以下のようになります。
LPSTR i;
unsigned long j;
j=100;
i=(LPSTR)malloc(j); //100バイト分のメモリを確保
if(i != NULL) { //確保に成功したら
  (void)memset(i,'\0',j); //第2引数は「NULL」でなく「'\0'」が正しい
} else { //確保に失敗したら
  printf("メモリが確保出来ません。");
  abort();
}

静的にメモリ確保するなら、以下のようになります。
LPSTR i;
CHAR buf[100];
unsigned long j;
j=100;
i=&buf[0] //bufの先頭のアドレスに初期化
(void)memset(i,'\0',j); //第2引数は「NULL」でなく「'\0'」が正しい

ここで、
LPSTR i;
は「文字列の実体を定義しているのではない」と言う事に注意して下さい。

投稿日時 - 2006-11-04 11:58:27

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

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

回答(5)

ANo.5

あまりにも問題点が多すぎます。

まず、環境が書かれていないので、LPSTR型というのがどんな型なのか特定できません。Windowsでよく使われる名前ですので、そうであろうと推測することにします。

LPSTR型がchar*の場合、ポインタが初期化されていないので、iの参照先は不定になります。これをmemsetに渡せば、動作は未定義になってしまいます。
memsetの第2引数はint型であり、第1引数が指すメモリブロックの各バイトを埋める文字を表します。NULLというのは空ポインタ定数ですから、まったくでたらめです。

> 警告が出ない方法を教えて下さい。

本来どうしたいのか分かりませんので、適切な方法をアドバイスすることができません。
単に警告を出ないようにするだけなら、memsetを呼び出している行をコメントアウトしてください。(ただし、あくまでも警告が出なくなるだけで、動くようになるわけではありません)

投稿日時 - 2006-11-04 12:51:59

ANo.4

文字列領域を初期化(ここでは NULLを埋める事を指す)する場合ですが、LPSTR i はあくまでも文字列へのポインタであって、文字列そのものの領域が存在しないとマズイですね。
質問者の方の例だと「文字列へのポインタ」はあっても「文字列の実体」が無いです。

char str[100];         <------文字列
LPSTR i;
unsigned long j;
j=100;
i = str;            <------文字列へのポインタ
(void)memset( i, NULL, j);

投稿日時 - 2006-11-04 12:34:49

ANo.3

訂正
LPSTR型はポインタですから、何が何でも初期化したいのであれば
i = \0;
じゃないでしょうか。

ポインタが指す文字列を初期化したいのであれば
*i = '\0';
かな

投稿日時 - 2006-11-04 11:59:24

ANo.1

LPSTR型はポインタですから、何が何でも初期化したいのであれば
i = '\0';
じゃないでしょうか。

ポインタが指す文字列を初期化したいのであれば
*i = '\0';
かな

投稿日時 - 2006-11-04 11:57:46