wsprintf(p, "%d" , i);
を書いたせいで、i の値が変わります。
wsprintf(p, "%d" , i);
によってどんなことが起こっているのか詳しく知りたいです。
ポインタのことがまだよく分かってないんです。
#include <windows.h>
LPCSTR szStr = "\n char c[255];\n char *p = \"\\0\";\n int i = 12345;\n\n switch (msg){\n case WM_LBUTTONDOWN:\n wsprintf(c, \"%d\" , i);\n wsprintf(p, \"%d\" , i);\n MessageBox(hWnd , c , \"\" , MB_OK);\n break;";
LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM);
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE , LPSTR , int){
省略
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){
HDC hDC;
PAINTSTRUCT ps;
RECT rt;
char c[255];
char *p = "\0";
int i = 12345;
switch (msg){
case WM_LBUTTONDOWN:
wsprintf(c, "%d" , i);
wsprintf(p, "%d" , i);
MessageBox(hWnd , c , "" , MB_OK);
break;
case WM_PAINT:
GetClientRect(hWnd, &rt);
hDC = BeginPaint(hWnd, &ps);
DrawText(hDC, szStr, lstrlen(szStr), &rt, DT_WORDBREAK);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd , msg , wParam , lParam));
}
return (0L);
}
No.1
- 回答日時:
プログラムは全部見てないんですが・・
ここのところ、
>char *p = "\0";
char p[20];
にしたほうがいいと思います。(20は、適当に大きめにね)
どうしても p をポインタ変数にしたいときは、
char s[20];
char *p;
p = s;
のように別途エリアを確保する。
p が指し示すメモリエリアは、"\0"(=0x00) が格納されたアドレスになっています。
>wsprintf(p, "%d" , i);
で、数バイトの文字列がコピーされますので、その分を確保しておかないと、結果はおかしくなります。
ポインタを乗り越えれば、「ビギナ脱出」だと思います。
がっばってネ。
ありがとうございます。
下で教えてもらったばっかりの char *p = "\0"; が
まだよく分かってなくて質問したけど、もう分かりました。
No.2ベストアンサー
- 回答日時:
こんにちは。
itohhといいます。ykkw_2001さんの回答に補足します。
このソースコードを見てみると、
>char *p = "\0";
>int i = 12345;
は、隣り合ったエリアを確保しているのだと思います。
(この辺はコンパイラが自動的に決めます。)
*pは1バイトのエリアです。そしてiはintなので4バイトのエリアです。
そして、
>wsprintf(p, "%d" , i);
では、pのアドレスから5バイト(12345を書き込むエリア)+1バイト(\0)が必要です。
(printf系の関数は最後にNULLを自動的に書き込みます。)
ですから、「wsprintf(p, "%d" , i)」を実行した段階でiのエリアにも不正な書き込みが
行われてしまったのだと思いますよ。
ありがとうございます。
wsprintf(p, "%d" , i); では p に6バイト必用なのに
p は1バイトしか確保してないから、残り5バイトが
たまたま p の次に確保されていた i のデータを
上書きしてしまったんですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
C言語のプログラムについてです
-
C言語で文字列をかえす正しい書...
-
char型にint型の数値を代入する。
-
strcpy関数で文字型変数へのポ...
-
const char* s1とただのchar s1...
-
C言語 strstrの実装
-
警告
-
CStringからchar*への型変換に...
-
fstream型オブジェクトを関数の...
-
文字列の途中から途中までを抽出
-
文字列のswap
-
C++17で、unsigned char * 配列...
-
小数点入りの文字列をfloat型に...
-
Cの関数の引数のconst *charに...
-
strcat関数を自作したいです
-
'\\0'とはなんですか?
-
文字列の演算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
strcat関数を自作したいです
-
C++17で、unsigned char * 配列...
-
文字列内の数字削除
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
C言語を用いた環境変数の作成/...
-
動的メモリの初期化方法について。
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
文字列の途中から途中までを抽出
-
C言語:小文字を大文字に変換す...
おすすめ情報