パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

iPhone の Wi-Fi を無効化する SSID のバグ、影響範囲が広がる」記事へのコメント

  • 素のprintfはともかく、その子分が長い歴史でchar[] string = sprintf(format, (in_str1, in_str2)); とかPython風の記法にならなかったのが謎。何故に副作用を持つのだ。

    • by Anonymous Coward

      上記の例だと関数がメモリ割り当ても行う必要ある?
      便利感とやりすぎでは感がある

      • by Anonymous Coward

        strdup() [linuxjm.osdn.jp]

        • by Anonymous Coward

          なるほど。

          C言語の中の人のことを正直わかってないのだが、ヘッダファイルで言うと
          sprintf - stdio.h
          malloc - stdlib.h
          strdup - string.h
          らしい。こことかで何かあるのだろうか。stdioはstdlibは使いたくないがstringは気にしないとか

          • by Anonymous Coward

            std**.h は Standard *** の略で昔からある基本機能、これを使うことに躊躇う理由は何もない
            とはいっても string.h を使うのを躊躇う理由も何もないけど、strdup は使わないかなぁ

            C 言語を使う理由の1つに「メモリ管理を隠蔽しない」というのがある
            関わる人全員が「strdup 内で malloc されていて、その戻り値は自分で free しないといけない」と分かっていれば良いけど、その前提は厳しい
            malloc したものは free する(あるいは相当するプロジェクト独自関数を使う)、とコーディングルールに定めておくと見通しが良くなります
            # なお私は自分で管理したくないので C++ 使います

            • by Anonymous Coward

              どもども。

              stdlib.h、適当に検索したらUNIX v7にstdlibはありませんか?とかいうStackoverflowの翻訳ぽい記事があって、89年ごろは
              環境によってあったりなかったりしたぽい。stdlib.hが無くてもmallocはあると思うけど。

              stdio.hは検索とかしてないけど、stdlib以前に成立してるなら、そのAPI設計は後年stdlibになる関数の依存を薄くすることは
              ありえると思う。sprintfが今の形になったのがそのためかはわからない

              • by Anonymous Coward on 2021年07月08日 18時39分 (#4066658)

                ヘッダの成立はともかく、printf にしろ malloc にしろ K&R(ごく初期) の時点で存在する関数です
                sprintf が今の引数になっているのは、メモリをプログラマが管理する、という前提を守ったからではないでしょうか
                この引数だと書き込む先の領域がスタックでもヒープでもいいので、環境依存も減らせます
                # ヒープのないマイコンでも動かすために必要だし、と思ったけどそんな環境に sprintf なんて高機能な関数載ってないか……

                親コメント
              • by Anonymous Coward

                こんにちは。

                K&RC 2版が手元に残ってたんで(初版1989、手持ちは2000頃の版)見てみたけど、strdupも記載があるのはあるね。
                書きっぷりからユーザー定義関数ぽくて、サンプルプログラムとしてたまたまの登場か、当時の環境でも
                事実上の標準として存在したのかはちょっとわからないけど。

              • Arduinoにはsprintfありますね。

                Arduinoのプログラムって、uint8_t で十分なところにlongとか下手するとfloatを平気で使ったりして、
                8bitCPUに何させるの、と、貧乏性の自分には心臓に悪いコードが多いですけど、

                ヒープは一応あるけど容量厳しいので、動的メモリ確保(malloc や new)してるコードはほとんど見かけない。
                C++ベースだけどオブジェクトはグローバル変数として静的に定義するのが基本。

                親コメント

身近な人の偉大さは半減する -- あるアレゲ人

処理中...