C言語なら俺に聞け 161

■ このスレッドは過去ログ倉庫に格納されています
2023/04/21(金) 14:05:20.18ID:rqj2HSDF0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C23 最新ドラフト
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 160
https://mevius.5ch.net/test/read.cgi/tech/1672191630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/06/04(日) 23:06:52.44ID:MHoxWKtY0
>>170
C11 で規定されているけれど仕様としてはオプショナルなもの。
つまり処理系はそれを提供しなくても仕様準拠を名乗れる。

ただし、提供するならばマクロ __STDC_LIB_EXT1__ も定義しておくことになってる。
そんで使うときにはヘッダのインクルード前に __STDC_WANT_LIB_EXT1__ を define しておく必要がある。

MSVC は C11 が発行される前から scanf_s などを提供していた
(というかマイクロソフトがこれらを標準に入れるように働きかけていた)
のでバージョンによっては __STDC_WANT_LIB_EXT1__ を定義するという手順を介さなくても使えるのかもしれない。
私は MSVC を使ってないのでよう知らん。
2023/06/04(日) 23:52:26.98ID:AabPy4gc0
>>171
失礼しました
gccでコンパイルしたところfopen_sという関数は定義されていないという趣旨のエラーが出た形です
以下詳細になります


環境:WSL2 Ubuntu
コマンド(bash):gcc sample.c -o sample.out

出力:
/home/hoge/Code/sample.c:17:13: warning: implicit declaration of function ‘fopen_s’; did you mean ‘fopen’? [-Wimplicit-function-declaration]
17 | if((error=fopen_s(&fp,filename,"r")) != 0){
| ^~~~~~~
| fopen
/usr/bin/ld: /tmp/ccIXo3dN.o: in function `main':
/home/hoge/Code/sample.c:17: undefined reference to `fopen_s'
collect2: error: ld returned 1 exit status
2023/06/04(日) 23:59:42.49ID:AabPy4gc0
>>172
>>173

ありがとうございます!
アドバイスを参考に以下のように変更しましたが174と同様のエラーが出ます(T_T)

コマンドを以下のように変更
gcc -std=c11 sample.c -o sample.out

ソースファイルの先頭に以下を記述
#define __STDC_WANT_LIB_EXT1__ 1
176デフォルトの名無しさん (ワッチョイ 82ad-N/Lw)
垢版 |
2023/06/05(月) 00:18:53.38ID:6AEqxzj80
なんか人気のfopen_s関数について
https://blog.ef67daisuki.club/2017/04/%E3%81%AA%E3%82%93%E3%81%8B%E4%BA%BA%E6%B0%97%E3%81%AEfopen_s%E9%96%A2%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
2023/06/05(月) 10:37:04.03ID:ejs/048Ga
legacy_stdio_definitions.lib
2023/06/05(月) 18:03:48.62ID:7VR84C5ud
fopen_sって初めて知った
MS社内だけで通じる方言って感じでイヤな感じだな
fopenで書くようにしたほうがいい
2023/06/05(月) 18:11:20.30ID:7VR84C5ud
だいたいwinAPIはファイルを開く時はCreateFile()系を標準にする方針だと思ってたんだが
なんでfopenのパチモノを作るのか理解に苦しむ
2023/06/05(月) 18:32:16.74ID:OwVyUwPA0
世界征服に決まってるだろ
2023/06/05(月) 18:47:37.75ID:Fd2GxywXd
CreateFile はファイルロックの制御が細かくできたり、ファイルがすでに存在する場合の
処理や、セキュリティなどを考慮した処理など細かい設定ができる。
WindowsではfopenはCreateFileで実装されてるようだ。
2023/06/05(月) 19:09:52.27ID:SzwJbur+0
>>179
CreateFileなんかで書いたら移植のとき困るだろ
そもそもプラットフォーム気にせず書けるようにCライブラリとして標準化させようとしているんだし
Windowsは移植性を考慮しないならCreateFile系のほうが柔軟に高度なプログラミングが出来るからCreateFile系使えと言っているだけ
2023/06/05(月) 20:35:19.71ID:ZwQJL2Eg0
APIを使うと毎回特権リングを呼び出すから、
小さい読み書きが多いとオーバーヘッドになる
Cランタイムはバッファを使って特権リングの
呼び出しを減らしている
2023/06/05(月) 20:40:56.74ID:LsGdvfPCd
>>182
標準化しようとするなら引数や戻り値をfopenに似せるべきだ
これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
2023/06/05(月) 20:52:58.24ID:SzwJbur+0
>>184
あくまでCライブラリとして標準化
古い関数に仕様を合わせる必要はないべ

>これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
仕様を読まない初心者が悪いと思うんだが
2023/06/05(月) 20:54:52.49ID:OwVyUwPA0
委員長、読まなきゃ使えない関数は捨てられてしまうと思います!
2023/06/05(月) 20:58:18.67ID:SzwJbur+0
初めて使う関数なら一度は仕様見ろよ
2023/06/05(月) 21:10:47.13ID:OwVyUwPA0
じゃあ、使う必要が出てきたら読むことにします
当分、読むことなさそう
2023/06/05(月) 21:43:17.97ID:EJphWr1dd
>>185
必要はある
今回のようにfopen_sをfopenに書き換えようとする(または逆)場合に変なミスを誘発する
大した理由もなく戻り値を変更すべきじゃない(またはfopenの名前を使うべきじゃない)
190デフォルトの名無しさん (ワッチョイ 6ebb-tVFH)
垢版 |
2023/06/05(月) 23:26:16.43ID:wc9Gft1n0
>>168
void*について学習してきました。
キャストしないと使えないようですが、キャストする型の指定はswitch-caseや#ifなどで分岐する感じでしょうか?
それとももっと賢いやり方がありますか?
2023/06/05(月) 23:46:37.21ID:pW8wFDDTd
>>190
memcpyなら型が分からなくとも無理やりコピーできる。
192デフォルトの名無しさん (ワッチョイ 22fb-w9Bk)
垢版 |
2023/06/06(火) 00:27:27.18ID:WKo3IR4c0
void*は元の形がint*でもchar*でもとりあえず何でもありで受け付けるやつ

元の型が何だったかは結局はプログラマ側が保証しとかないといけないので取り扱いは結構危険
2023/06/06(火) 03:21:52.62ID:JM/jMtmO0
>>189
>大した理由もなく戻り値を変更すべきじゃない
関数の戻り値でエラーを返すことでグローバル変数のerrno読み出しタイミングの問題(マルチスレッド対策)に対応したいところって意図だと思うけど違うんかね?
まあ戻り値ではハンドル返してアドレス渡しでエラーを受け取るという方法もあるとは思うけど

>またはfopenの名前を使うべきじゃない
機能としては同じだし俺は別にfopen系の名前のほうが分かりやすくて良いと思う
言いたいことは分かるけどさ、初心者やベテランに関わらずちゃんと仕様を確認するってだけのことじゃね?
194デフォルトの名無しさん (スプッッ Sd02-w9Bk)
垢版 |
2023/06/06(火) 08:23:57.44ID:Wehdob+6d
fprintf_sとかの他の関数がerrnoを返さない以上、
fopen_sでだけerrnoを返しても一貫性がなくて無意味に感じられるんだよな。

結局のところerrno自体をスレッドセーフになるように作るしかなくて、
それで解消したんじゃなかったっけ?
2023/06/06(火) 08:40:25.14ID:SiwHVjTU0
>>161 を見てると
コンテナに入れたいのは int な整数なんよな
リングバッファだから 積む側と引っ張り出す側のそれぞれのインターフェースが必要になるけど
 void push(int); 実体を受けて内部で malloc してそっちに格納
 void pop(int*); malloc された内容を 引数に渡して mallocしたポインタは free しとく

この int の部分が任意の型でよしなにしようとすると
 void push(void* , size_t size);
2023/06/06(火) 08:42:43.61ID:SiwHVjTU0
途中送信してもた
void push(const void* , size_t); 実体はポインタで渡す
void pop(void* , size_t);
のように size_t で実体のサイズもらうしかないよね
2023/06/06(火) 08:43:39.37ID:TmtPJsyo0
>>193
errno は C11 以降は thread local storage ということになってる。
errno をセットした後に別のスレッドによって内容が書き換えられるということはない。
(やろうとすれば出来なくはないが……。 普通に使ってて間違ってやってしまうということはないだろう。)

C99 でも errno は変更可能な左辺値 (に展開されるマクロ) であることは要求されているが
それが関数呼出しによって得られるものであってもかまわないという記述もあり、
スレッドまわりで問題を起こさないようにする処理はその関数に入れることが出来る。
C99 ではスレッドローカルの概念は提供していないが事実上はスレッドローカル的な
実装に出来るように配慮されてる。

errno が不格好な設計であるのは確かだが、マルチスレッドでは問題にはならない。
198デフォルトの名無しさん (アウアウウー Sac5-Rr/m)
垢版 |
2023/06/06(火) 13:00:47.04ID:h4TMdgn6a
>>182
そんなのは fork を先にさっさと実装してから家
2023/06/06(火) 13:06:36.37ID:h4TMdgn6a
>>190
void *hoge は hoge++ 出来ないけど
int *i は i++ 出来るし
double *d も d++ 出来るし
i++ と d++ で足される数も違う
switch case で対応するのはおすすめしない
2023/06/06(火) 13:23:11.34ID:Ydo+/HsJM
>>198
forkは効率が悪いから必要ない
プロセスは_spawnを使ってスポーンっと産み出すもんだw
2023/06/06(火) 15:35:36.55ID:DWV+4S+md
GetLastErrorみたいにスレッドローカルにすればいいんだよ
2023/06/06(火) 21:21:59.69ID:XFiIFtrgd
>>190
そろそろそのやり方自体が賢くないって気づかないかな
2023/06/06(火) 21:26:13.17ID:9F60+Uyo0
是非賢いお手本をお願い
2023/06/06(火) 21:43:27.13ID:t5k+pzJSM
switchは良くないと思うよ

利用側でそれぞれの型用に別々の関数を書いて使う人が使い分ける感じじゃないかな
それこそ知らんけどレベルで申し訳ないが
2023/06/06(火) 22:36:35.79ID:QLr+SdPOd
>>203
毎回関数を作る
だってリングバッファだぞ
目をつぶっていても作れるぞw
2023/06/07(水) 07:49:00.73ID:uhVmgr37a
>>203
お手本の定番は qsort() だろ
2023/06/07(水) 08:29:44.13ID:MtVH7DHg0
>>205
そういうのはライブラリ化しておくべき
2023/06/07(水) 09:26:39.45ID:PykR7vOnd
fread(void *buf, size_t size, size_t n, …
の順もあれば
qsort(void *base, size_t num, size_t size, …
の順もあって
行き当たりばったり感
2023/06/07(水) 12:34:45.81ID:hQs7a5Jyd
>>207

じゃあ、ほい

struct CUE{
int size;
int max;
int inp;
int out;
char buf[1];
};

struct CUE *create_cue(int size, int max)
{
struct CUE *cue =malloc(sizeof(struct CUE)+size*max);
if(cue){
cue->size=size;
cue->max=max;
cue->inp=cue->out=0
}
return cue;
}

int cue_get(struct CUE *cue, void*data)
{
if( cue->inp ==cue->out )
return 0;//buffer empty
memcpy(data,&cue->buf[cue->out* cue->size],cue->size);
if(++cue->out>=cue->max) cue->out=0;
return 1;
}

int cue_add(struct CUE *cue, void*newdata)
{
int index = cue->inp;
if(++index>=cue->max) index=0;
if( index ==cue->out ) return 0;//buffer full
memcpy(&cue->buf[cue->inp* cue->size],newdata,cue->size);
cue->inp=index;
return 1;
}

目をつぶって作ったのでバグがあっても知らない
要するにこういうことでしょ
他の人が言ってるように型チェックがまったく働かないので俺は使いたくない
2023/06/07(水) 13:05:36.32ID:xTW5tL3jd
memcpyは余計だな。ポインタを返して後は使用者(自分)に委ねるね俺は
2023/06/07(水) 14:05:23.13ID:lsOQP3og0
見てないけどCUEって時点でもう程度が知れる
212デフォルトの名無しさん (ワッチョイ 5146-rNJ6)
垢版 |
2023/06/07(水) 15:08:50.29ID:hYVl7Kw10
重箱の鬼の首をとる応用例

・(Perlを)Pearl って時点でもう程度が知れる
・(Daemon を)Demon って時点でもう程度が知れる
2023/06/07(水) 16:05:48.27ID:e1NBMLRC0
Luciferの事もたまには思い出してあげて
2023/06/07(水) 21:46:42.98ID:xi4mV2dDp
ダブルスラッシュがコメントに採用されたのどの版から?
2023/06/07(水) 22:41:36.55ID:JgjHIelbd
>>210
概念的にはgetした瞬間にリングバッファから取り除かれてるはずなので
実際にはバッファが一回りするまで残っているが
消えてるかどうか曖昧で気持ち悪いのでコピーで返したほうが望ましい
まあ好みかもしれんが
2023/06/08(木) 11:06:02.87ID:rxjbLVG0a
>>214
MSVC じゃなくて MS-C の 3 くらいからあったかも
217デフォルトの名無しさん (スプッッ Sd02-w9Bk)
垢版 |
2023/06/08(木) 12:46:07.00ID:m0+KFU8md
C99から
それ以前でもコンパイラ拡張で//コメントをサポートしてるのはあるらしいけど
以下のようなエッジケースで解釈が変わる

b=a//**/ 2
;

//コメントを認めないならb=a/2;
//コメントを認めるならb=a;
2023/06/08(木) 12:55:42.05ID:ldHYl5bi0
> 目をつぶって作ったのでバグがあっても知らない

そういうのは「作った」とは言わない
219デフォルトの名無しさん (ワッチョイ 5146-rNJ6)
垢版 |
2023/06/08(木) 13:01:02.12ID:5qYvg3Wg0
盲者のモノ作りなど認めない。
2023/06/08(木) 13:06:43.94ID:2i+h5Gbt0
目開けても何も見てない奴いるからな
2023/06/08(木) 13:39:09.53ID:JhrUsqpHd
野良審査員には餌をやらん主義
2023/06/08(木) 14:35:42.49ID:Iro3x2NJ0
>>214
C99 からだが経緯としては先に C++ で採用されていたという事情がある。
C with Classes から C++ になる 1984 年頃に BCPL 風を参考にして
スラッシュふたつで始めるコメント記法が導入され、
更に 1998 年にそのコメント記法も含めて ISO の規格として確立した。

C と C++ でプリプロセッサは共用することも多いだろうし
コメントはプリプロセッサで除去するだろうから
C++ で採用された段階で実際には C でもスラッシュふたつのコメント記法を
使えていた環境は割と有ったのだと思う。
2023/06/08(木) 14:52:55.41ID:ldHYl5bi0
マイクロソフトが独自拡張で当時C++のみのはずの//をCでも許していた
言わずと知れた屈指の大手がやっているので規格が追認することとなった
2023/06/08(木) 16:45:48.60ID:JA9B62300
gccも使えてた気がする
2023/06/10(土) 18:04:06.65ID:Yvl44ooC0
90年後半からしか実務で使ってないけどVCでは普通に書けてたな
UNIX系はベンダー製のCの制限が酷かった思い出
2023/06/10(土) 18:47:34.87ID:Yrme8ZC10
borlandやwatcomでも使えなかったっけか?
2023/06/10(土) 20:49:31.43ID:6EfmWVuRd
便利だからね
オプションで使えなくすることもできたはず
2023/06/16(金) 01:45:49.62ID:q8ApsJJ90
int a[3] = {};
int b[3] = {0};

aの初期化はgcc拡張で規格に沿っているのはbの初期化だと記憶していたんだけど、
規格の6.7.8を見るとメンバの個数より波カッコで囲まれた初期化子が少ない場合は暗黙的に静的に初期化するとあった。
この規格の文章を見る限りはaも規格に合致していると思えるんだけど、aがgcc拡張っていうのは本当ですか?
2023/06/16(金) 02:08:30.52ID:q8ApsJJ90
参照した規格はX 3010:2003 (ISO/IEC 9899:1999) です
2023/06/16(金) 08:46:04.94ID:qgM8i0iT0
>>228
本当。文法が空の {} を許していない。
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation(opt) initializer
initializer-list , designation(opt) initializer

C23 から↓で initializer に {} が追加されてようやく通るようになる。
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2900.htm
2023/06/16(金) 16:12:05.48ID:ly+Q1cW8a
struct hoge {
char a[];
};
struct fuga {
char a[0];
};
2023/06/16(金) 16:20:37.85ID:q8ApsJJ90
>>230
なるほど構文規則ってところを見るんですね
どうもありがとう
2023/06/16(金) 17:28:57.05ID:QEmhRLek0
>>228
gcc でも -pedantic オプションを付けたら警告は出るぞ。

> warning: ISO C forbids empty initializer braces
2023/06/17(土) 21:50:15.83ID:q+Kf8pNU0
>>233
知りませんでした!
どうもありがとう
2023/06/25(日) 08:36:37.75ID:D6GgnyEK0
int main(void)って書く流派ってどこでそんなの身に着けたの?
2023/06/25(日) 09:20:49.86ID:yrM2OONq0
>>235
ISO/IEC 9899:2011
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
237デフォルトの名無しさん (ワッチョイ 4b46-GfJH)
垢版 |
2023/06/25(日) 10:53:26.83ID:/MLTigPj0
>>235
この指摘をしばしば見るが、int main(void) が違反だった時代はいつ頃なの。
2023/06/25(日) 10:56:42.79ID:D6GgnyEK0
C99からint main(void)と書いてもいいらしい
2023/06/25(日) 11:13:38.04ID:+vRVyhzX0
main については C89 のときから変わってないよ。
2023/06/25(日) 11:58:52.46ID:yrM2OONq0
>>237
K&R Cにはvoidというキーワードが存在しなかった
2023/06/25(日) 12:22:01.62ID:D6GgnyEK0
K&R第2版にint main(void)なんて書き方出てきた記憶がないんだよね
2023/06/25(日) 12:38:23.47ID:6RRGV0Qg0
printf(null);
2023/06/25(日) 12:38:51.73ID:+vRVyhzX0
>>241
日本語版だと 41 ページに
「リストが明らかに空であるときには,予約語 void を使うべきである」
と書かれているのを見つけた。
2023/06/25(日) 17:09:36.88ID:+vRVyhzX0
関数定義のときに仮引数がゼロ個なら void を書くのは当然の作法なんだから
main についてはどうでも良いとはいえども main だけ空にするのもなんか変じゃない?
2023/06/25(日) 19:26:05.36ID:20Xxe9+j0
処理系は引数で任意のスタートアップを指定できるからmain書きたくない需要も満たせるよ
2023/06/25(日) 22:39:44.42ID:7VFzLtX7d
>>235
めんどくさいだけだろ
2023/06/26(月) 06:14:35.93ID:F8cl0T7T0
めんどくさい流免許皆伝
248デフォルトの名無しさん (ワッチョイ 4b46-GfJH)
垢版 |
2023/06/26(月) 07:16:23.26ID:xzT4Agq20
初級、めんどくさいので略記
初段、めんどくさいので無注釈
免許皆伝、めんどくさいので無ドキュメント
2023/06/26(月) 08:07:26.96ID:5ZBA7oeF0
組み込み系ならmainに引き数なんて不用
2023/06/26(月) 08:52:43.48ID:r2qj24yMd
元々プログラムはまんどくさいを代行するものだし・・・
2023/06/26(月) 12:05:19.83ID:TXNTP2LF0
組み込みでmainか・・・
ベクタテーブル作るときのラベルがマングリングされてないから短く済むけどそれだけ
2023/06/26(月) 12:06:17.67ID:TXNTP2LF0
あ、ここCだっけ
サーセン
2023/06/26(月) 13:00:03.75ID:DZPgqn/v0
>>249
main に引数が有るか無いかの話じゃなくて、無いときに void を書くという話題だよ。
2023/06/26(月) 13:16:56.95ID:6bPwUIFfp
実際の組み込み系には、二つのmainエントリーがある
引数のある奴と、無い奴な
2023/06/26(月) 13:20:15.17ID:TXNTP2LF0
>>254
組み込みでargcとargvはどんな意味があるってんだ?
コンソールがあるって前提?
2023/06/26(月) 13:24:00.16ID:6bPwUIFfp
意味なんて知るか
ブートローダとか色々都合があるんだよ
2023/06/26(月) 13:31:08.91ID:yiohjGaX0
環境依存しまくってる部分だとは思うけど
組み込み用のコンパイラでも エントリは main のままなのね
2023/06/26(月) 13:43:40.71ID:6bPwUIFfp
組込みの真のエントリーはresetな
でも普通はそこからmainまではハード会社が提供してる
初期化処理が入るからあんまり触らない
2023/06/26(月) 16:47:50.70ID:D5GxB3wJd
リンカにわたすオプションで_startだか_resetだかを指定してるだけ(例えばld -e _start)
自分で初期化を書きたければmakefileに先頭ラベルを記述すればいい
2023/06/26(月) 17:33:04.45ID:O3f/yVVZM
割込みベクタテーブルのリセット割込みのアドレスがエントリポイント
マイコンのリセットでプログラムカウンタのアドレスが設定される
2023/06/26(月) 20:20:34.26ID:6bPwUIFfp
>>260
石によるだろそんなん
2023/06/26(月) 20:39:52.87ID:TXNTP2LF0
K&R Cで「死産だった」とされるentryというキーワードは、多分このへんの話だったんだろうな
263デフォルトの名無しさん (スプッッ Sd03-eK8M)
垢版 |
2023/06/26(月) 20:56:23.88ID:aG57g/0Md
そもそもCPU(マイコン)と、そのCPUの命令セットに翻訳するコンパイラに自由度を与えるためにC言語規格で明言することを少なめにしてる

0x100からカウンタが始まるだのブートローダーが必要だの環境依存の初期化はコンパイラが知ってれば十分。
2023/06/26(月) 21:02:50.78ID:6bPwUIFfp
コンパイラは知らないよ
スタートアップライブラリが知ってる
2023/06/26(月) 21:10:49.81ID:TXNTP2LF0
そそ
266デフォルトの名無しさん (ワッチョイ e3fb-eK8M)
垢版 |
2023/06/26(月) 21:26:51.56ID:L7dTsKCZ0
ああそうかコンパイラ自体は初期化手段知らなくてもいいのね
2023/07/07(金) 14:46:28.07ID:Cp8NbwGm0
#include <stdio.h>

void stack_size_estimate()
{
int dummy; // スタック上に確保するダミー変数

// スタック上のポインタとダミー変数の差を計算
unsigned long stack_size = (unsigned long)&dummy - (unsigned long)&stack_size_estimate;

printf("Estimated stack size: %lu bytes\n", stack_size);
}

int main()
{
stack_size_estimate();
return 0;
}

Windowsで実行すると毎回結果がばらばらになる
2023/07/07(金) 14:52:43.24ID:RkflWXNN0
.textと.bssを比較すりゃさもありなん
2023/07/07(金) 15:00:57.31ID:Rpkmzd56p
プログラムとデータは別れてんだよなぁ
2023/07/07(金) 16:12:54.67ID:h0HZTRPQM
アドレス空間レイアウトのランダム化 (ASLR)だろ
差じゃなくてポインターの中身を表示してみればいいじゃん
2023/07/07(金) 16:20:17.47ID:gGTaLgTI0
>>267
64bit 版の Windows だとしたら unsigned long はポインタを表すのに十分なサイズではない。
上位バイトが丸ごと抜け落ちて意図した計算が出来てないと思う。

へんなところを引き算するよりベースアドレスを基準に観察したほうがわかりやすいよ。
歴史的事情で Windows ではインスタンスハンドルがベースアドレスそのものということになってる。
272デフォルトの名無しさん (スップ Sd22-PY2F)
垢版 |
2023/07/07(金) 16:42:49.80ID:LOYSagRvd
そういやlongはWindows環境だと32bitだっけか
size_t使ったほうが面倒がなさそう
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況