パスワードを忘れた? アカウント作成
12900727 journal
日記

dodongaの日記: 愚痴(char NULL) 8

日記 by dodonga

dodongaです。

2点、愚痴ってみる。
※C言語です

愚痴1:
charの読みを「きゃら」に強要される。
もう30年来「ちゃー」だけど「キャラクタの発音を知らな馬鹿に見られる」との理由
お馬鹿か。英語圏では「ちゃー」だろ。
Bjarne Stroustrup も ちゃー派で安心/論拠ができた\^^
http://www.stroustrup.com/bs_faq2.html#char

愚痴2:
char XXX[YYY]:
memset(XXX, 0, sizeof(XXX));

memset(&XXX[0], NULL, YYY);
に強要される。
&XXX[0]はまだいい。慎重ととらえられる。
でも、NULLはないだろう。これは無知だろう。お馬鹿だろう。C言語知らないだろう。
NULLポインタとヌル文字の区別ついていないだろう。
sizeof しないのもお馬鹿だろう。理由はサイズがコードから判らないからだそうです。

#どれも反論は許可されませんでした。

辞めようかな、この会社

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • sizeof しないのもお馬鹿だろう。理由はサイズがコードから判らないからだそうです。

    バッファの大きさ的なモノであれば、とりあえず#defineとかconst size_t以下略で。
    しかし、構造体の領域を動的に確保してぜろふぃるする場合、sizeof無しは嫌な感じ。

  • by Anonymous Coward on 2016年08月31日 9時28分 (#3072859)

    char配列の領域ってプラスヌル文字(char1バイトの場合YYY+1バイト)じゃなかったっけ。
    sizeof演算子にしても、その変数が確保している領域だから配列がサイズを保持する実装だとサイズもクリアされてしまうような。
    C言語は中途半端なのでアセンブリ言語に移行したような老害の古い知識ですけど。

    • by Anonymous Coward
      配列は配列なので、指定した大きさの通りですよ。
      また、配列のサイズは配列内には保持しませんので後者の心配も要りません。

      sizeofが嫌がられてたのって、誰かが

      void hogeInit(char *array) {
          memset(array, 0, sizeof(array));
      }

      とかやらかしたんじゃないですかね……。
    • by Anonymous Coward

      長さYYYの文字列に必要な配列長はYYY+1だけど

      XXX[YYY]で取った配列にはYYY-1の文字列+YYY番目(0開始でYYY-1のところ)に\0(ヌル文字)が入れられて、配列長自体はYYY、なので

      > memset(XXX,0,sizeof(XXX))
      > memset(&XXX[0],'\0',YYY)

      で合ってると思いますよ。

      # NULLを設定値にするのはないけどな...いくら(ほとんどの環境で)0のマクロっても...

      配列はC的にはこの場合大丈夫
      # 直接確保できてる保障があるならsizeof(XXX) はありだが...これはこれでポインタにしちゃったやつとか類似なもののトラブルもなくはなく、難しい...

  • by Anonymous Coward on 2016年08月31日 10時14分 (#3072885)

    char XXX[YYY] = {};
    じゃダメなんか

    • by Anonymous Coward
      一応、C の文法的に、先頭要素だけは書かないといかんから、正確には
      char XXX[YYY] = {0};

      バッファサイズが静的な物なら、YYY は定義せずに
      typedef char HOGE_BUFFER[100]
      とかって書くほうが好みだな。
      バッファサイズとして YYY の値が必要なときは sizeof(HOGE_BUFFER) で取れるから、コード上にマジックナンバーとして表われることもないし、YYY がたまたま同じ値の違う意図で流用される心配がない。
  • by Anonymous Coward on 2016年08月31日 23時29分 (#3073397)

    NULL が ((void *)0) って、初期の unix がゼロ番地をアクセスさせない
    アドレスマップ構成だったからだと思うのです。
      (kernel が ~0x7FFF_FFFF で user が 0x8000_0000~)

    だから昨今の ARM とか組み込み系だと、ゼロ番地が有効だったりするので
    「絶対にアクセスしない番地」は別の番地になるはずだと思うのです。

    ヒロシです。

typodupeerror

ソースを見ろ -- ある4桁UID

読み込み中...