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 しないのもお馬鹿だろう。理由はサイズがコードから判らないからだそうです。
#どれも反論は許可されませんでした。
辞めようかな、この会社
どういう場面か知らないけど (スコア:2)
バッファの大きさ的なモノであれば、とりあえず#defineとかconst size_t以下略で。
しかし、構造体の領域を動的に確保してぜろふぃるする場合、sizeof無しは嫌な感じ。
C言語はいい加減(老害の偏見) (スコア:0)
char配列の領域ってプラスヌル文字(char1バイトの場合YYY+1バイト)じゃなかったっけ。
sizeof演算子にしても、その変数が確保している領域だから配列がサイズを保持する実装だとサイズもクリアされてしまうような。
C言語は中途半端なのでアセンブリ言語に移行したような老害の古い知識ですけど。
Re: (スコア:0)
また、配列のサイズは配列内には保持しませんので後者の心配も要りません。
sizeofが嫌がられてたのって、誰かが
void hogeInit(char *array) {
memset(array, 0, sizeof(array));
}
とかやらかしたんじゃないですかね……。
Re: (スコア:0)
長さ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) はありだが...これはこれでポインタにしちゃったやつとか類似なもののトラブルもなくはなく、難しい...
初期化 (スコア:0)
char XXX[YYY] = {};
じゃダメなんか
Re: (スコア:0)
char XXX[YYY] = {0};
バッファサイズが静的な物なら、YYY は定義せずに
typedef char HOGE_BUFFER[100]
とかって書くほうが好みだな。
バッファサイズとして YYY の値が必要なときは sizeof(HOGE_BUFFER) で取れるから、コード上にマジックナンバーとして表われることもないし、YYY がたまたま同じ値の違う意図で流用される心配がない。
どうでもいいんだけど (スコア:0)
NULL が ((void *)0) って、初期の unix がゼロ番地をアクセスさせない
アドレスマップ構成だったからだと思うのです。
(kernel が ~0x7FFF_FFFF で user が 0x8000_0000~)
だから昨今の ARM とか組み込み系だと、ゼロ番地が有効だったりするので
「絶対にアクセスしない番地」は別の番地になるはずだと思うのです。
ヒロシです。
どうでもよくありません。それがこの日記の趣旨です。 (スコア:1)
dodongaです。
NULLは0ではありません。nul文字は定義から0です(ASCIIのnul)。
なので、
memset(&XXX[0], NULL, YYY);
はお馬鹿なのです。
以前の会社の後輩ですが
memset(&XXX[0], NULL, YYY);
みたいに書けず
NULL をdefineで ((void *)0)を定義してた子を叱ったことがあります。
#OSははHPだたかなぁ。遠い思い出です。
閑話休題