2004/02/09 (月)

(/_;) SCO 爆撃機

急にたくさん飛来。ZIP 形式のは怖いから確認しなかったんだけど、scr というスクリーンセーバモドキの形式で来たからとりあえずバイナリエディタで開いてみた。

こいつ、UPX で圧縮してるのね…。怖いからそれ以上しなかったけど。

で、大量飛来中。それも、だえもん(正しくは MAILER-DAEMON:メーラデーモン)さんから。そのメールによると、送信者が「mika_chan@nunu.nu」なんだよね…。無料の転送メールなんだけど、このアドレスとったのってえらい昔だよ?本人が忘れてたくらいだから。mika_chan っていう明らかに名前っぽいものが含まれてるからアレなんだけど、とりあえず某姫が「ミカ」でないのは確かなので、少なくとも某姫に熱を上げるよりは前、と。

ためしに、メールボックスの中の全メール探してみたけど、SCO 爆撃機以外はヒットせず…。

どこの誰?感染したのは……。Google 先生もご存知ないみたいだし…。

(/_;) 火狐?

Mozilla.ORG から Mozilla Firefox 0.8 がリリースされました。

これは、Mozilla Firebird 0.7 の後継です。名称変更の理由は、DB のFirebird とかぶって紛らわしいから。しかし、この Firefox 君、波乱万丈の名前の歴史だなぁ…。Phoenix, Mozilla Firebird, Mozilla Firefox...。愛用者としては結構名称変更は辛いのです…。あと、アクセス解析プログラムの作者としても。

とはいえ、ちょっと広めることをやってみようかと。遊びだけど。 Get Firefox

さて、ダウンロードしよっと…って、インストーラ版しかないじゃん…。英語なのは構わんのだけど…。

(/_;) 紛らわしい用語

仕事中に「""」って書いたら、NULL と読まれたようだ…。これは、空文字列であって、NULL とは違うのに…。NULL っていうのは NULL ポインタ、つまりどこも指し示さないポインタなので、

char *p = NULL

とかしないとなりません。

今回の場合、

char buf[] = "";

と本質的に等しいわけで、buf は最低1バイトの大きさを持ちます。そして、&buf[0] ( == buf) はなんらかのポインタをさすはず。

よく混同するものに、「\0」があります。これは、nul 文字であって、NULL ではありません。MSDN さえ間違った訳になってるのでなんともいえないんですけどね、これは。たとえば、

char buf[10] = "TEST";

って書くと、

char buf[10] = {'T', 'E', 'S', 'T', '\0'};

と等しいわけです。つまり、「C 文字列」の終端記号であって、NULL ポインタではありません。なお、上のコードはともに、buf[5] 以降の値は不定です。この「C 文字列」ですが、「nul 終端文字列」または「null 終端文字列」ともいいます。間違っても、NULL 終端文字列ではありません。もっとも、NULL は 0 なはずなので、

buf[4] = NULL;

とか書いても通っちゃう処理系もありそうだけど。

っていうか、VC++ 6では通っちゃうね…。個人的には、

#define NULL ((void *)0)

だけでいいような気がする。

たまにはプログラマっぽいこと書いてみるテスト

本日のツッコミ(全3件) [ツッコミを入れる]
・・)ノfetus(2004/02/10 (火) 02:05)

ちなみに、gcc では

null.cpp:6: 警告: assignment to non-pointer type `char' from NULL
null.cpp:6: 警告: argument to non-pointer type `char' from NULL

といった感じに怒ってくれます。曰く「ポインタじゃない char に NULL 突っ込むなや!」(超意訳)

・・)ノfetus(2004/02/10 (火) 02:05)

ちなみに gcc(g++) は
gcc バージョン 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

・・)ノfetus(2004/05/29 (土) 15:34)

char hoge[10] = {0, }; とかすると、hoge の要素はすべて 0 で初期化されます。
このテクニック、WINAPI 周りの構造体でよく使えます。
たとえば、

WNDCLASSEX wndcls;
ZeroMemory(&wndcls, sizeof(wndcls);
wndcls.cbSize = sizeof(wndcls);

なんてコードが、

WNDCLASSEX wndcls = { sizeof(wndcls), };

と書けたりします。
Windows の構造体で、サイズをとるものは構造体の先頭にいることを応用できるのです。サイズ以外の要素も 0 で初期化されるので多い日も安心(謎

私は仕事でもこういった類のコード書くけど、知らなきゃ怖いんだろうな、と思う次第。
もっとも、C++ 規格のどこに書かれているかは知りませんが。

いまさらなお話でした。(検索でヒットしてくる人が多いみたいなので、恥を必要以上に広めないために…。書き直すつもりはないので。)

[]