学校のプロジェクトで、C を使用した情報システムがありました。生徒の記録の動的なサイズのリストを保持するために、リンクされたリスト データ構造を使用しました。今朝、友人が彼のシステムを見せてくれました。私は彼の記録のリストに驚いた:
#include <stdio.h>
/* and the rest of the includes */
/* global unsized array */
int array[];
int main()
{
int n;
for (n=0; n < 5; n ++) {
array[n] = n;
}
for (n=0; n < 5; n ++) {
printf("array[%d] = %d\n", n, array[n]);
}
return 0;
}
コードと同様に、彼はプログラム全体に対して (bss セグメントで) グローバルなサイズのない配列を宣言しました。彼は、次のように配列をトラバースできるように、メモリの後続のブロックをゼロ以外の値で上書きすることにより、配列に新しいエントリを追加することができました。
for (n=0; array[n]; n++) {
/* do something */
}
彼はTurbo C v1を使用しました(私もテストしました)。Linuxで試してみましたが、動作します。
以前にこの手法に遭遇したことがないので、問題があると推測しています。それで、ええ、なぜこれが悪い考えなのか、そしてリンクされたリストよりもこれを好む理由を知りたい.