K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2363] ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:トト
2024/02/29 23:14:47

 前回、!isalnumの件で伺った者です。 教えて頂き、ありがとうございました。  今回も「ポインタ完全制覇」内の本章の主旨からずれてますが、 自力解決できない箇所があり、申し訳ありませんが二つ質問さてください。  ①第4章、List 4-4 realloc.c(p238)でint型の値(数値)を入力しても、 17行目〜19行目のprintf("variable_array[%d]..%d¥n", i, variable_array[i]);が 表示されません。 試しに11行目、while分のブロック内で15行目に printf(" VARIABLE_ARRAY[%d] = %d\n", size-1, variable_array[size-1]);と記述を加えたら、 int型の値を入力する度に上記printf文は表示されます。  List4-4の正しい表示結果は、値(数値)を入力するたびに18行目のprintf文が表示される イメージをしています。 なぜ18行目のprintf文が表示されないのか教えてください。 又、私の理解不足がありましたらご指摘ください。 ②List4-3,4-4でfree(variable_array);と私は記述を加えました。 本章でfree()を使われていないのはどのような理由からでしょうか。 入門者向け学習サイトでは「必ずfree()」,「プログラム終了時に消える」、様々な事が書かれています。 教えて頂けたら幸いです。 今回もこのようなレベルですみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2364] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:(ぱ)こと管理人
2024/03/02 02:08:03

> ①第4章、List 4-4 realloc.c(p238)でint型の値(数値)を入力しても、 >17行目〜19行目のprintf("variable_array[%d]..%d¥n", i, variable_array[i]);が >表示されません。 このプログラムは、数値を入力するwhileループが11~15行目にあり、 そのwhileループが終わった後、17~19行目に、配列の内容を表示する forループがあります。whileループが終わってからforループが始まるので、 値(数値)を入力するたびに何かが表示されるわけではありません。 このプログラムは、 ①ユーザが数値をいくつか入力する。いくつ入力するかはわからない。 ②ユーザが数値の入力を終えたら、入力された数値を全部表示する。 というものです。①が終わってから②を実行します。 ①でユーザがいくつ数値を入力するかわからないから、realloc()で 配列を伸ばしていく、というのが趣旨です。 ①で、入力を終えるには、Windowsなら、数値をいくつか入力後、 Ctrl+Z を押してからENTERを押してください。 > ②List4-3,4-4でfree(variable_array);と私は記述を加えました。 >本章でfree()を使われていないのはどのような理由からでしょうか。 >入門者向け学習サイトでは「必ずfree()」,「プログラム終了時に消える」、 >様々な事が書かれています。 それについては25年くらい前にここに書きました。 https://kmaebashi.com/programmer/c_yota/malloc.html WindowsでもLinuxでも、まともなOSならプログラム終了時にはfree()しなくても 解放してくれるので、たとえばライブラリとして再利用することなど考えられない 書籍のサンプルコードでは、free()は不要だと私は考えています。 当時のfj.comp.lang.cのやりとりも検索したら残っていました。 https://groups.google.com/g/fj.comp.lang.c/c/G4HRnHTdImg?pli=1 まあ、これぐらいもめる話ではあるので、深入りしないほうが無難かと思います……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2365] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:トト
2024/03/03 00:13:44

今回も教えて頂きありがとうございます。 >①で、入力を終えるには、Windowsなら、数値をいくつか入力後、 >Ctrl+Z を押してからENTERを押してください。 このような一時停止、再開操作をするプログラムを初めて知りました。 while(...,stdin)で、たしかに終わりどころは・・・・と思ってもいました。 下段、for文内でインクリメントされたsizeを使っていることからも納得です。 「入力するたび・・・イメージしています。」な訳ないですよね。 学習ではMac gccを利用してます。 おかげで操作法の副産物も得る事ができました。 free()の詳細もありがとうございました。 重ねて御礼申し上げます。 「25年くらい前・・・」恐れ入ります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2366] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:(ぱ)こと管理人
2024/03/03 23:56:35

>>①で、入力を終えるには、Windowsなら、数値をいくつか入力後、 >>Ctrl+Z を押してからENTERを押してください。 > >このような一時停止、再開操作をするプログラムを初めて知りました。 >while(...,stdin)で、たしかに終わりどころは・・・・と思ってもいました。 ちょっと不安を感じるのですが、このプログラムで「一時停止、再開動作」を しているのは、fgets()のところで入力待ちの時に一時停止、入力してENTERを 押したら再開、というところです。しかしこれはgetchar()だろうが scanf()だろうがfgets()だろうがキーボードで入力待ちになったら発生することです。 while (fgets(buf, 256, stdin) != NULL) { … というループが終了するのは、見ての通りfgets()がNULLを返した時です。 fgets()がNULLを返すのは、ファイルの終わりが来た時で、標準入力 (デフォルトではキーボード)で、ファイルの終わり(EOF: End Of File)を 示す手段が、WindowsではCtrl+Z、ENTERだということです。 Macは私は持ってませんが、ターミナルでEOFを示す方法は、(UNIXと同じく) Ctrl+Dだと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2367] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:トト
2024/03/11 21:13:50

返信が遅くなりまして、すみません。 昨夜,投稿に気づきました。 指摘して頂きありがとうございます。 違った解釈をしていました。 【 指摘前(c言語 サイト参照) 】 [Ctrl]+[z]... Mac ↓ “ [1] + Stopped ./a.out  ” ... 停止(Macターミナル表示) [fg] 又は [fg 1] と入力。        ... 再開 ↓ (例)(Macターミナル表示) variable_array[0]..12 variable_array[1]..2 variable_array[2]..1              :              : をしていまし。 >ちょっと不安を感じるのですが、このプログラムで「一時停止、再開動作」を >しているのは、fgets()のところで入力待ちの時に一時停止、入力してENTERを >押したら再開、というところです。しかしこれはgetchar()だろうが >scanf()だろうがfgets()だろうがキーボードで入力待ちになったら発生することです。 > >while (fgets(buf, 256, stdin) != NULL) { > … > >というループが終了するのは、見ての通りfgets()がNULLを返した時です。 >fgets()がNULLを返すのは、ファイルの終わりが来た時で、標準入力 >(デフォルトではキーボード)で、ファイルの終わり(EOF: End Of File)を >示す手段が、WindowsではCtrl+Z、ENTERだということです。 >Macは私は持ってませんが、ターミナルでEOFを示す方法は、(UNIXと同じく) >Ctrl+Dだと思います。 【 指摘後 】 [ Ctrl ] + [ D ]でした。 EOFを入力する手段とは知りませんでした。 (もしかした今まで学習サイトで目にしているのに、忘れているのかもしれません) 質問の仕方が初めから「どうしたらwhile(...(stdin)...!=NULL)ナルを返せますか?(Mac使用)」と、 私が聞ければよかったです。お手間取らせました。 不安を感じて指摘して頂きありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]