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);
}

このQ&Aに関連する最新のQ&A

A 回答 (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のエリアにも不正な書き込みが
行われてしまったのだと思いますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/01/23 00:31

プログラムは全部見てないんですが・・



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

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

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

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

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

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

ポインタを乗り越えれば、「ビギナ脱出」だと思います。
がっばってネ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
下で教えてもらったばっかりの char *p = "\0"; が
まだよく分かってなくて質問したけど、もう分かりました。

お礼日時:2002/01/23 00:31

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qホームページビルダーでポインタが巨大化されます。

OS98「ホームページビルダー5.04」で作業していますが、画像などを移動する際、「+矢印」や「⇔」が巨大化されてしまいます。作業しづらいのでもとに戻したいのですが、方法ご存知の方教えてください。

Aベストアンサー

それは、ホームページビルダーのバグだったと思います。
(このバグが報告されているのは、WinMeだったとは思いますが)

http://www-6.ibm.com/jp/software/internet/hpb/down3.html#v5fix
ここから修正プログラムがダウンロードできます。

これで直るといいのですが・・・

参考URL:http://www-6.ibm.com/jp/software/internet/hpb/down3.html#v5fix

QhDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWn

hDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWnd)の違いについて

表題について,お伺いします。
ビットマップをダイアログに表示するソースコードを
書いてますが,参考書やさまざまなHPでは,
ウィンドウハンドルをゲットする際に

hDC=::GetDC(m_hWnd) ○
↑と書かれております。

hDC=GetDC(m_hWnd)  ×
↑はなぜだめなのでしょう。

 ●このスコープ演算子::は何の為につけているのですか?

::が無いとエラーになるので必要みたいですが・・

Aベストアンサー

どういうエラー(リンクエラー、コンパイルエラー)なのかがわからないので、
あくまで憶測ですが、
Windows.hで定義されているGetDC()の他に、
別のスコープに(例えばクラスのメソッドとして)、
GetDC()が定義されているのではないでしょうか?

上記の状態でスコープ演算子がないときには、
同じクラス(スコープ)にあるGetDC()を先に呼ぶことになるので、
目的のWindows.hのGetDC()を呼ぶことができないのだと思います。

参考URL:http://wisdom.sakura.ne.jp/programming/cpp/cpp7.html

Qなぜ昆虫は巨大化すると自重で・・?

なぜ昆虫は巨大化すると自重で・・?

なぜ自重で潰れると言われるのでしょうか?
過去の同種の質問への回答を幾つか見てきたのですが、
いまいち理解できません。

脊椎動物と、外骨格の生き物の体の支え方には
どんな根本的な違いが有るのでしょうか?

酸素を体の隅々に送れないのが問題で
酸素濃度が高かった時代はその問題が低く昆虫は巨大化できた
などと言う話も聞きますが、進化で得られれば克服して
今の酸素濃度でも巨大化できたのでは・・
とも思えてしまいます。

詳しい方、何か教えて頂けますと幸いです。

Aベストアンサー

自重で潰れるとは誰の説なのでしょうか。現実に古生代には巨大昆虫が生息していましたから何の根拠も説得力もないと思います。現代に巨大昆虫が生存できないのは、酸素濃度が低いためという説が科学的には定説です。

古生代には酸素濃度は30%を超え最大で35%程度まであったと思われます。この環境では気管呼吸も十分に機能しまして昆虫も巨大になれました。しかし、その後酸素濃度が10%程度に低下したために巨大昆虫は全て死滅しました。

なぜ巨大昆虫が低酸素状態に適応できなかったのかは、関節が原因です。外骨格生物の関節は一方向にしか曲がりません。昆虫の頭部のように自由度の大きな関節は、実は小さな複数の関節の集まり、複関節から出来ています。一体節に一関節ですから複体節とも言われます。この関節部は可動部ですから運動器官以外の機能を持たせることが出来ません。ですからなるべく小さくする必要があります。しかし、小さくしますとその空間も狭まり気管も細くならざるを得ません。これが文字通りネックになりまして現世昆虫は巨大化できないのです。

解決策は複関節部を細くしないことですが、そうなりますと複関節を動かす筋や腱等も大きくしなければならず、まるで複関節のお化けのような生物になります。現実的ではないですね。小さなままでも立派に現在の地球を支配しているのですから巨大化する必要もありません。何かの参考になさってください。

自重で潰れるとは誰の説なのでしょうか。現実に古生代には巨大昆虫が生息していましたから何の根拠も説得力もないと思います。現代に巨大昆虫が生存できないのは、酸素濃度が低いためという説が科学的には定説です。

古生代には酸素濃度は30%を超え最大で35%程度まであったと思われます。この環境では気管呼吸も十分に機能しまして昆虫も巨大になれました。しかし、その後酸素濃度が10%程度に低下したために巨大昆虫は全て死滅しました。

なぜ巨大昆虫が低酸素状態に適応できなかったのかは、関節が原因です。外...続きを読む

Qwsprintf( ポインタ , "%d" , "123" );

char str[100];
char *ptr;

wsprintf(str, "%d", "1234567");

wsprintf(ptr, "%d", "1234567");
について、
TextOut(hDC,0,10,str,lstrlen(str));
TextOut(hDC,0,30,ptr,lstrlen(ptr));
で出力したいんだけど、str ならできたけど、
ptr の方が文字化けしていました。

lstrlen(ptr); がいけないのかと思って、
その値を調べたら 0 でした。

strlen( ) はポインタに対応していると思いました。

#include <iostream.h>
main(){
char *p = "あいう";
cout << strlen(p);
}

で 6 だったから。
Win32 の lstrlen( ) はポインタに対応していないんですか?

Aベストアンサー

> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]

> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;

> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。

書き換える先が、システムの領域だったら、「不正なアクセス」が起きて、プログラムが落ちます。Linuxだと「Segmentation fault」です。

後、配列とポインタは同じものと思っておいても通常差しつかえありません。array[a] は *(array + a) の様に解釈されます。そのため

int array[3] = { 1,2,3 };
printf("%d, %8x\n", array[0], &array[0]);
printf("%d, %8x\n", 0[array], &0[array]);
printf("%d, %8x\n", array[1], &array[1]);
printf("%d, %8x\n", 1[array], &1[array]);
printf("%d, %8x\n", array[2], &array[2]);
printf("%d, %8x\n", 2[array], &2[array]);

を実行してみてください。ただし、わかりにくくなるトリッキーな書き方なので、使わないのが普通です。

> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]

> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;

> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。

書き換える先...続きを読む

Q太陽の末期には巨大化し地球を飲み込むか

太陽の末期には巨大化し地球を飲み込むか
恒星の一生は末期には赤色矮星となり現在の数百倍の大きさになりその後自重力により収縮し、白色矮星にになるといことですが、巨大化した太陽は木星軌道程度まで大きくなるので地球は太陽に飲み込まれ消滅してしまう。
そこでの疑問ですが、太陽質量の増加による惑星の公転軌道に影響はないのでしょうか。
私の考えでは、質量の増加は重力の増加すなわち惑星の太陽へ引き込みが強くなる一方で、公転スピードは加速し、遠心力により軌道半径が拡大する。すなわち太陽が巨大化するにつれ惑星は太陽から遠ざかるので地球も同様で太陽に飲み込まれることはないと考えられないでしょうか。

Aベストアンサー

>赤色矮星となり現在の数百倍の大きさになり

それは赤色巨星です。「矮星」とは「小さな星」という意味です。

>自重力により収縮し、白色矮星にになる

膨れた外層が星から流れ出し、星の中心部が露出して白色矮星になります。

>巨大化した太陽は木星軌道程度まで大きくなる

大きくなるのは地球軌道くらいまで、という説もあり、まだ決着はついていないと思います。

>太陽質量の増加による

逆です。上述のように外層部が失われるので、太陽の質量は減少します(たぶん今の5~6割?になる)。

>惑星の公転軌道に影響はないのでしょうか。

あります。太陽が惑星に及ぼす引力が弱くなりますから。

>私の考えでは・・・

惑星の軌道が外側へ移動するのは確かですが、その理由は太陽の引力が強くなるからではなく、逆に弱くなるからです。極端な例として、ある瞬間に太陽の質量が零になる場合を考えましょう。太陽の引力が零になるわけですから、惑星は太陽におかまいなく、無限の彼方へ飛び去ってしまうでしょう。太陽の質量(よって引力)がじょじょに小さく(弱く)なる場合には、惑星が太陽から遠ざかる過程がじょじょに起こると考えればよいでしょう。

上述のように、太陽がどこまで膨れるかはまだはっきりわかっていないと思います。また、太陽の外層がいつどれだけ流出するかについても同様です。このような不確定なことがらのために、太陽がやがて地球を飲み込むかどうかについては、まだ断言できないと思います。

ちなみに、この問題では、太陽から流れ出す物質の中を地球が運動することの効果も考える必要があるかもしれません。地球の軌道運動は流出物質との摩擦によってブレーキをかけられます。この効果は地球を徐々に太陽に落ち込ませる方向に働きますから、地球が太陽から遠ざかるスピードを落とそうとします。

>赤色矮星となり現在の数百倍の大きさになり

それは赤色巨星です。「矮星」とは「小さな星」という意味です。

>自重力により収縮し、白色矮星にになる

膨れた外層が星から流れ出し、星の中心部が露出して白色矮星になります。

>巨大化した太陽は木星軌道程度まで大きくなる

大きくなるのは地球軌道くらいまで、という説もあり、まだ決着はついていないと思います。

>太陽質量の増加による

逆です。上述のように外層部が失われるので、太陽の質量は減少します(たぶん今の5~6割?になる)。

>惑星の公転...続きを読む

QSendMessage(hW,WM_CREATE,0,0);を

SendMessage(hW,WM_CREATE,0,0);
を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです
というのはそれ以降キー入力を無視するようになるのです
いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります
WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

Aベストアンサー

>プログラムのイニシャライズのために送ったのですが送らないで住むプログラムに変更しました

普通はそんな方法はとりません。
システムが何をするか分からないからです。

自分でメッセージを定義して、初期化処理を行うようするためのメッセージを送るほうが無難です。
WM_CREATEと同じ処理を初期化処理として行わせたいのであれば、初期化処理を関数化して自分で定義したメッセージでも呼び出せばいいのですし。


>作ったプッシュボタンを押してシステムがWM_COMMANDを送ってきた後キー関係のメッセージを送ってくれなくなります

プッシュボタンがキーボードフォーカスを持ってのるでは?

ボタンがキーボードフォーカスを持っていてもキー関連のメッセージを親ウィンドウが受け取りたいのであれば、サブクラス化をするしかないでしょう。

Q小赤(餌金)の巨大化についてですが、

小赤(餌金)の巨大化についてですが、
肉食魚の餌さ用にストックしていた小赤に愛着が沸き、
育てているのですが、だんだん巨大化し(現在18cmほど)、どうせなら最大サイズを目指そうと思います。

そこで質問なのですが、
1 最大サイズはどれくらいになりますか?
2 巨大化にするためのオススメのエサはなんですか?
3 巨大化にするためのオススメ環境など何でもいいのでアドバイス下さい。

ちなみに今の環境は、
60cm水槽2匹飼いで、ヒーターなし、エサとして肉食魚のエサのキャットをあげています。(安い浮きエサを食べないので)

Aベストアンサー

金魚好きの友達のいってた話なんですが
本気ででかくするなら田んぼのような泥池に逃がすらしい、、極論ですね^^;
容器で飼うならミジンコや藻が沢山沸いてると結果がいいらしいです(物理ろ過はなしで)
見せてもらったら、20cm先の金魚が見えなかった。

一般人から見るとどっちもホント極論ですが参考になれば・・・・

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Q目の下に脂肪の塊?らしきもの巨大化しています

イングリッシュポインタもどきの犬でメス12歳です。
左目の下にこぶが出来ていて最初は膿のようなものがたまっていたのですがほっといたら脂肪の塊のようなものに変化し急速に巨大化して目の開閉まで困難になる状況となりました。

獣医は危険な箇所でもあり手術を遠回りに拒否。

私ら飼い主も獣医がそうならとほったらかしにしています。

このままほったらかしにしてていいものか

いちかばちかの博打で手術して取ってしまったほうが良いのか

獣医師もしくは犬の専門家の方からのアドバイスをお願いします。

Aベストアンサー

獣医師でも、専門家でもありません・・・

>獣医師もしくは犬の専門家の方からのアドバイスをお願いします。

なら、病院を変えては?
あと2,3診察を受けて 皆同じ意見なら
多分正しい判断ではないでしょうか?

>獣医は危険な箇所でもあり手術を遠回りに拒否

その理由がわからずに、診察もしないで答えられる獣医って・・・
多分全身麻酔で、切開をする事になるはずです
年齢も考慮すると・・・麻酔のリスクを避けたいんだと思います
死んじゃったら、訴えられて後が大変ですから・・・

>脂肪の塊のようなものに変化し急速に巨大化して

破裂したら大変ですよ?
部屋中に膿が飛び散って、臭くなりますよ
外犬なら、被害は抑えられますが・・・

>私ら飼い主も獣医がそうならとほったらかしにしています。

お金掛かりますよ?
そんなに安くはありません

可愛そうですが・・・ ワンちゃんは自分で病院に行けません
今まで何もしなかったのが、なぜ今になって
ご自身で言われるようなギャンブルのような手術をしようか迷うのですか?
もっと早くに迷って欲しかったです

獣医師でも、専門家でもありません・・・

>獣医師もしくは犬の専門家の方からのアドバイスをお願いします。

なら、病院を変えては?
あと2,3診察を受けて 皆同じ意見なら
多分正しい判断ではないでしょうか?

>獣医は危険な箇所でもあり手術を遠回りに拒否

その理由がわからずに、診察もしないで答えられる獣医って・・・
多分全身麻酔で、切開をする事になるはずです
年齢も考慮すると・・・麻酔のリスクを避けたいんだと思います
死んじゃったら、訴えられて後が大変ですから・・・

...続きを読む

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。


人気Q&Aランキング

おすすめ情報