Data & Algorithm 今回のお題:
『アクロバティックなコード (1) - 長さ 0 の配列


●概要

題名の通り、「長さ 0 の配列」を使うコードです。妙にアクロバティックなことをしていて、処理系によっては通りません。 「うまくいけば動く」、そんな一般性に欠けたコードですが、上手く応用すれば使えるような……気がします。

ちなみに、あの shi3z 大先生の昔のページからのパクりです。ひぃ(汗

●実装

コードは以下の通り。短いのでそのまま載せちゃいます。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct st{
  int  i;
  char s[0];    /* 長さ0の配列 */
};

void main( void )
{
  struct st *p;
  char *str = "abcdefg";
  int l;

  l = strlen( str );
  p = malloc( sizeof( int ) + sizeof( char ) * ( l + 1 ) );
  strcpy( p->s, str );

  putchar( p->s[3] );
}

何やってるか、判りますか ? 上手く通れば「 d 」が表示されるはずです。 「可変長文字列クラスのデータ部分だけ引っこ抜いた形」になるのかな。
実際に使用する場合は、アクセスは何らかの関数を介してする方が良いでしょう。 っていうか、そうでもしないと意味不明になってしまいます。

このコードは、"char *s;" で宣言すると、宣言時には s の指す先が不定だけど、 "char s[0];" で宣言すると、s の指す先はメンバ i の次の位置になる、 という性質を利用しています。

ちなみにこれを上手く使うと、文字列末尾の NULL 文字が要らなくなります。 でも、そうすると、文字列操作がいろいろ面倒臭くなるんだよなぁ……。

●備考

このコードが「上手く動かない」条件としては、

この3つ位ですか。VC++ では蹴られます。LSI C-86 では見事通りました。万歳。

C++ で使いたい場合は、配列の大きさを 1 にして同じようなことをやれば、 多分出来る……と、思います。


戻る