
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で質問しましょう!
似たような質問が見つかりました
- その他(悩み相談・人生相談) こういう話を聞いて、どう思うんだろう 1 2022/12/05 00:09
- Google Drive Googleドライブの警告メッセージを消す方法 4 2022/09/21 06:04
- Access(アクセス) エクセルのVBAについて教えてください。 4 2023/01/21 10:21
- その他(悩み相談・人生相談) マジで打たないでよかった… 4 2022/12/03 16:01
- 事件・犯罪 脅迫罪や暴行罪の時効および告訴期間中の安全対策について 2 2022/08/30 15:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Windows 10 PCの初期化をしたのにマイクロソフトアカウントが残っている 2 2023/03/21 20:48
- Excel(エクセル) ExcelのVBAコードについて教えてください。 1 2023/01/13 10:42
- Visual Basic(VBA) VBA ステータスバー DoEvents 1 2023/03/30 12:22
- Excel(エクセル) エクセルについて教えてください。 一度入力した文字や数字を誤って削除や変更しないために、削除や変更を 3 2022/10/30 10:36
このQ&Aを見た人はこんなQ&Aも見ています
-
charからLPTSTRへの変換方法
C言語・C++・C#
-
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
-
-
4
char*を初期化したいのですが
C言語・C++・C#
-
5
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
6
CString型の文字列連結について
C言語・C++・C#
-
7
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
8
CStringをwchar_tに変換したい
C言語・C++・C#
-
9
LPTSTR型の変数に文字を格納
C言語・C++・C#
-
10
wsprintf関数の使い方について
C言語・C++・C#
-
11
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
12
'int' から 'LPCSTR' に変換できません。
C言語・C++・C#
-
13
文字列の置換をCStringで(C++)
C言語・C++・C#
-
14
ダイアログボックスで指定したサイズどおり表示されない
C言語・C++・C#
-
15
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
16
WORD型をCString型に変換する方法
C言語・C++・C#
-
17
DWORDとcharの変換
C言語・C++・C#
-
18
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
19
LPCWSTRとchar
C言語・C++・C#
-
20
作成したウインドウのサイズを固定するには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Run-Time Check Failure #3とい...
-
セグメントエラー
-
init関数の意味
-
デバイスハンドルとは?
-
ポインタについて
-
C言語によるメモリ読み書き
-
C言語のポインタに直接アドレス...
-
いまc言語を独学で勉強している...
-
戻り値で構造体を返すことは可...
-
ダイアログから、ドキュメント...
-
NULLとブランクの違い
-
マクロ,クラス
-
基本アルゴリズムの『返す』の...
-
ハンドル、アドレス、ポインタ...
-
ポインタ変数のインクリメント
-
ポインタの宣言
-
多重delete
-
ポインタにによる値の表現と文...
-
C#,C++/CLI,MFCにおけるデータ...
-
LPSTR型の初期化について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
fopne で失敗する原因
-
PASCALとFARの意味
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
プーさんのマウスポインタを教...
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
自作DLLの引数について、ポイン...
-
NULLポインタが0でない処理系と...
-
TCHAR文字列内の検索について
おすすめ情報