
No.2ベストアンサー
- 回答日時:
どのメモリを初期化したいのでしょう?
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;
は「文字列の実体を定義しているのではない」と言う事に注意して下さい。
No.5
- 回答日時:
あまりにも問題点が多すぎます。
まず、環境が書かれていないので、LPSTR型というのがどんな型なのか特定できません。Windowsでよく使われる名前ですので、そうであろうと推測することにします。
LPSTR型がchar*の場合、ポインタが初期化されていないので、iの参照先は不定になります。これをmemsetに渡せば、動作は未定義になってしまいます。
memsetの第2引数はint型であり、第1引数が指すメモリブロックの各バイトを埋める文字を表します。NULLというのは空ポインタ定数ですから、まったくでたらめです。
> 警告が出ない方法を教えて下さい。
本来どうしたいのか分かりませんので、適切な方法をアドバイスすることができません。
単に警告を出ないようにするだけなら、memsetを呼び出している行をコメントアウトしてください。(ただし、あくまでも警告が出なくなるだけで、動くようになるわけではありません)
No.4
- 回答日時:
文字列領域を初期化(ここでは NULLを埋める事を指す)する場合ですが、LPSTR i はあくまでも文字列へのポインタであって、文字列そのものの領域が存在しないとマズイですね。
質問者の方の例だと「文字列へのポインタ」はあっても「文字列の実体」が無いです。
char str[100]; <------文字列
LPSTR i;
unsigned long j;
j=100;
i = str; <------文字列へのポインタ
(void)memset( i, NULL, j);
No.3
- 回答日時:
訂正
LPSTR型はポインタですから、何が何でも初期化したいのであれば
i = \0;
じゃないでしょうか。
ポインタが指す文字列を初期化したいのであれば
*i = '\0';
かな
No.1
- 回答日時:
LPSTR型はポインタですから、何が何でも初期化したいのであれば
i = '\0';
じゃないでしょうか。
ポインタが指す文字列を初期化したいのであれば
*i = '\0';
かな
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
charからLPTSTRへの変換方法
C言語・C++・C#
-
char*を初期化したいのですが
C言語・C++・C#
-
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
-
4
CString型の文字列連結について
C言語・C++・C#
-
5
wsprintf関数の使い方について
C言語・C++・C#
-
6
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
7
CString から LPCTSTRの型に変換
C言語・C++・C#
-
8
ハンドルはポインタか
C言語・C++・C#
-
9
OCXって何ですか?
Visual Basic(VBA)
-
10
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
11
ATLとMFCの違いは何でしょうか?
C言語・C++・C#
-
12
ダイアログボックスで指定したサイズどおり表示されない
C言語・C++・C#
-
13
string→CStringの型変換について
C言語・C++・C#
-
14
error C2664: 'LPCTSTR' に変換できません。
C言語・C++・C#
-
15
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
16
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
17
LPTSTR型の変数に文字を格納
C言語・C++・C#
-
18
静的でないメンバ関数の呼び出しが正しくありません
C言語・C++・C#
-
19
適切な変換関数が存在しない???
C言語・C++・C#
-
20
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
ハンドルはポインタか
-
引数のポインタについて
-
[C言語] NULLは必ず0(番地)です...
-
セグメントエラー
-
ファイルポインタのヘッダーフ...
-
#define NULL ((void *)0) の弊害
-
IStream / VBA
-
参照型で受け取った引数をポイ...
-
変数の中身がごみかどうか判定...
-
ポインタに ~0を入れること
-
init関数の意味
-
アドレスをint変数に代入する方法
-
戻り値で構造体を返すことは可...
-
TCHAR文字列内の検索について
-
CWnd::EnableWindow()の扱い方
-
【C言語】別関数でポインタの値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
セグメントエラー
-
#define NULL ((void *)0) の弊害
-
fopne で失敗する原因
-
LPSTR型の初期化について
-
トリプルポインタが必須!とな...
-
戻り値で構造体を返すことは可...
-
c言語で任意のファイルから読み...
-
参照型で受け取った引数をポイ...
-
ポインタについて
-
アプリを32bitから64bit移行
-
ハンドル、アドレス、ポインタ...
-
ポインタが文字化けしてる?!...
-
NULLポインタが0でない処理系と...
-
ハンドルはポインタか
-
リトルエンディアンというもの...
-
【C言語】戻り値が構造体の関数
おすすめ情報