OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

wsprintf( ) でポインタに代入

  • 暇なときにでも
  • 質問No.201735
  • 閲覧数550
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 59% (194/328)

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);
}
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル12

ベストアンサー率 45% (210/459)

こんにちは。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のエリアにも不正な書き込みが
行われてしまったのだと思いますよ。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
wsprintf(p, "%d" , i); では p に6バイト必用なのに
p は1バイトしか確保してないから、残り5バイトが
たまたま p の次に確保されていた i のデータを
上書きしてしまったんですね。
投稿日時 - 2002-01-23 00:31:54
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル13

ベストアンサー率 26% (267/1014)

プログラムは全部見てないんですが・・ ここのところ、 >char *p = "\0"; char p[20]; にしたほうがいいと思います。(20は、適当に大きめにね) どうしても p をポインタ変数にしたいときは、 char s[20]; char *p; p = s; のように別途エリアを確保する。 p が指し示すメモリエリアは、" ...続きを読む
プログラムは全部見てないんですが・・

ここのところ、
>char *p = "\0";
char p[20];

にしたほうがいいと思います。(20は、適当に大きめにね)

どうしても p をポインタ変数にしたいときは、
char s[20];
char *p;
p = s;

のように別途エリアを確保する。

p が指し示すメモリエリアは、"\0"(=0x00) が格納されたアドレスになっています。

>wsprintf(p, "%d" , i);
で、数バイトの文字列がコピーされますので、その分を確保しておかないと、結果はおかしくなります。

ポインタを乗り越えれば、「ビギナ脱出」だと思います。
がっばってネ。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
下で教えてもらったばっかりの char *p = "\0"; が
まだよく分かってなくて質問したけど、もう分かりました。
投稿日時 - 2002-01-23 00:31:50


このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ