![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
5
char*を初期化したいのですが
C言語・C++・C#
-
6
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
7
LPCWSTRとchar
C言語・C++・C#
-
8
LPTSTR型の変数に文字を格納
C言語・C++・C#
-
9
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
10
画面を強制的に再描画させる方法
C言語・C++・C#
-
11
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
12
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
13
外部依存関係について
C言語・C++・C#
-
14
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
15
#defineの定数を文字列として読み込む
C言語・C++・C#
-
16
LPWSTRのコピー
C言語・C++・C#
-
17
エディットボックスの入力制限について
C言語・C++・C#
-
18
error C2664: 'LPCTSTR' に変換できません。
C言語・C++・C#
-
19
newしないオブジェクトについて
C言語・C++・C#
-
20
c++std::string型をTCHARに変換したい!
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
ハンドル、アドレス、ポインタ...
-
構造体とfscanf
-
DXライブラリ:ポインタと配列?
-
デバイスハンドルとは?
-
どうしてエラーになるかわかり...
-
Cで作成したDLL関数をVBから呼...
-
C言語の関数と配列に関する質問
-
▼C言語 ポインタ
-
ポインタの結合に関する質問です
-
お絵かきソフトにUNDO、REDOを...
-
IStream / VBA
-
コンストラクタでnewを失敗した...
-
NULLポインタが0でない処理系と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語の関数と配列に関する質問
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
構造体とfscanf
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
DLL<->VB間での受け渡し(文字...
-
エラーの意味
-
PASCALとFARの意味
-
ハンドルはポインタか
-
CWnd::EnableWindow()の扱い方
おすすめ情報