>>525 >配列の範囲をオーバーするアクセスは動作未定義。
マジで? きっちり定義されてたものだと思ったが・・・
宣言された配列の範囲外はアウトだろうけど、
サイズ0の配列はmalloc()で割り当てるから問題ない。
>>527 #include <stdio.h>
int main(void) {
volatile int i, arr[10];
for (i = 0; i < 20; i++) arr[i] = (int) main;
printf("Hello\n");
return 0;
}
うちの処理系(VC++2005)でこいつをコンパイルして実行したら、「Hello」がたくさん
表示された挙げ句に落ちた。これは定義された動作とは言えない。
ちなみにvolatileは最適化によるコードの消滅を回避するために必要。
>>528 ほとんどのコンパイラの実装だとまあ問題ないだろうが、それでも標準ではない。
VC++2005だとゼロ配列の定義は禁止されるし、構造体の末尾で宣言しても
非標準の拡張機能とやらで警告される。
万が一添え字を検査するような処理系があったとしたらmallocの余白が後方に
あろうが何だろうが容赦なく落とす可能性もある。
>>529 それは落ちるでしょ。メモリ確保して無いんだから。アホですか。
サイズ0の配列定義は、共用体で真価を発揮するんだよ
サイズ0については、C99で明確に使用可能となった。
C++でも出来た気がするが、処理系依存かもしれない(GCC等では、Cでも出来る)。
可変長構造体は、昔から使われているテクニック。
ファイルフォーマットがどうのというのは、本当のメリットではない。
(ヘッダとデータを別領域に置くやり方と大差ない)
本来は、例えば下のFAQの例において、namestrをポインタとして実体を別に持つことと比較して
mallocの呼び出しコストと管理領域(およびポインタ1つ分の領域)を節約するというのが
明らかなメリットを生かした使い方となる。
で、この可変長構造体と呼ばれるテクニックは、
C FAQにおいても、邪道ながら「全てのコンパイラで使える」と記されている。
http://www.kouno.jp/home/c_faq/c2.html#6 intのサイズを始め、ほとんどの「規格に明記されていない点」は
例外的な処理系をいくつも挙げているというのに。
>>531が綺麗にまとめてくれた。
けど、まあ、やっぱりそれでも、普通に邪悪だよな。
むしろC99で認められたあたり、完全にプロ向けの言語仕様だから
故意的に使うなら構わないってことなのかもしらんけど、
はじめて見た時は目疑った。
533 :
516:2006/10/10(火) 06:38:35
誰も、C言語の話ししてねーよ。
可変長構造体の話でもねーよ。
ArrayListの実装として、動的配列が使われていたりすると、
Length = 0で、当たり前の状況として、Size 0の配列ができあがるわけだが。
別に、ArrayListに限った話ではなく、生で使う場合でも、あるって話。
不思議なのは、元々の話が「C言語での話」であって
その中で「サイズ0の配列」の話が出ているのに
一人だけが「誰もC言語の話じゃない」と叫んでいること。
>>530 >>529は単に
>配列の範囲をオーバーするアクセスは動作未定義。
の簡単な例を挙げているだけに見えるのだが。そんなところに噛み(ry
と、どうでもいいところにつっこんでみるテスト
>>534 しらねーよ。
オレ、C言語使いじゃないし
でもこのスレC言語用なんだよね
>>536 習っとけよ。コンピュータ使いの一般教養なんだから。
>>536みたいなヤツって
友達だったら面白いヤツだけど、
会社の同僚だったら殺したいヤツだな。
友達にしたってトイレに流すわ、こんな厨房。
遅ればせながら、
ドヴォルザークの英語の綴りをググっている最中にここに辿り着きました。
ドヴォルザークでなぜここにw
ドヴォラック配列のことかー。
>>539 それって、約11日半。
半年に満たない。
>>548 だからもう書いてもいいんだよ。良かったね。
main()
{
printf("ハングルい むぐるうなふ くとぅるぅ るるいえ ウリ=ナムル ダンクン\n");
}
551 :
470:2006/12/24(日) 04:38:16
>>473 上連雀三平は、エロを通じて漫画の面白さを世に広めようとしてるんだよ。
アナルジャスティスも、となりの精液さんも、単なる通過点に過ぎない
と断言してもいい。
>>474 短編なら宇宙のよめがお勧め。
ここは・・・
誤爆につっこむ奴が居ないほど
過疎っているのか……
#define sizeof printf
#define long "%d %d\n", x??(10??), x??(11??)
main()
??<
int x??(100??);
x??(10??) = 2;
11??(x??) = 3;
printf("longのサイズ = %d\n", sizeof(long));
??>
555 :
デフォルトの名無しさん:2007/01/12(金) 18:18:21
もっとも短いC言語ソースコード
P;
最高に短いC言語ソースコード
558 :
デフォルトの名無しさん:2007/01/13(土) 05:38:32
>>555をコンパイルするためのコンパイルオプション
cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" \
-DP="main(){X}" -DR="read(0,&c,1)" -DT="c!=015" \
-DW="while(C)I" -DX="char c;W" file.c
というオチ
559 :
デフォルトの名無しさん:2007/01/14(日) 00:24:31
2ちゃんのcgiをcで書いたら最適化と称してものすごく邪悪なコードになりそうだな
既にcで書かれているわけだが
read.cgiってcだったんだっけ
read.cgiだけCだったかと。
Cじゃなきゃ処理できないでしょ、リクエスト数的に。
UNIX板の連中が書き直したんじゃないっけね、第1次消滅危機のとき。
ちぇっく
566 :
デフォルトの名無しさん:2007/01/15(月) 11:48:39
でも80行という565の書き間違いは凄さを矮小化してるな。
80字*n行を目指してる、が正解な。
17行かよw
怪 物 め
int i;
void main(void)
{
hogehoge();
}
・
・
・
とっくにあった
571 :
デフォルトの名無しさん:2007/07/02(月) 07:56:57
checkprime(n,cand){n*n<=cand?(cand%n==0||checkprime(n+2,cand)):printf("%d\n",cand);}loop(num,max){checkprime(3,num),(num+2>max||loop(num+2,max));}main(){loop(3,1000);}
forとかwhileとかgotoとか使わずに素数を求めるプログラム。
loopって関数使ってるやん(ノー`)
573 :
デフォルトの名無しさん:2007/07/03(火) 07:47:51
ifも使ってないの名
int table[10][10][10][10][10][10][10];
void init_table()
{
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
for(int k=0; k<10; k++)
for(int l=0; l<10; l++)
for(int m=0; m<10; m++)
for(int n=0; n<10; n++)
table[i][j][k][l][m][n] = 0;
}
一段すくねえよw