2016-09-27 15 views
1

私はちょうどstrcpy()を私の脳に封印するためにこれを作った。そして、ブラケットを空白のままにしておくと、コンパイラは初期化子が必要であるとか、コンパイルするのに必要な値が必要だと気づいた。しかし、私は括弧内に任意の値を入れることができ、それはまだコンパイルされます。 0であっても...しかし、strcpy()関数は、文字列が宣言されている文字列終端文字を追加すると、なぜかっこ内にプレースホルダを置く必要がありますか?以下Strcpy()配列宣言?

コード...

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

main() 
{ 
    char yearFirst[0]; <------ HOW DOES THIS still EXECUTE?? 
    char yearSecond[6]; 
    char month[5]; 

    /* when declaring strcpy function, place each copied string before. 
    their desired print function. 
    or else the print function will print thr same strcpy for each print 
    function proceeding it. 

    ex. 
     strcpy(yearFirst, "Sept., Oct., Nov., Dec., Jan."); 
     strcpy(yearSecond, "Mar., Apr., May., Jun. Jul., Aug."); 
     followed by: 
     printf("These months have 1-31 days: %s\n\n", yearFirst) 
     printf("These months have 1-30 days: %s\n\n", yearSecond); 

    output will equal both statements saying 
    "These months have 1-31: sept oct ...." 
    "these months have 1-30: sept oct....." 
    */ 

    strcpy(yearFirst, "Sept., Oct., Nov., Dec., Jan."); 
    printf("These months have 1-31 days: %s\n\n", yearFirst); 

    strcpy(yearSecond, "Mar., Apr., May., Jun. Jul., Aug."); 
    printf("These months have 1-30 days: %s\n\n", yearSecond); 

    strcpy(month, "Feb."); 
    printf("%s has 1-28 days\n", month); 

    return 0; 
} 
+0

少なくともC99、好ましくはC11にコーディングする必要があり、 'main()'で明示的な戻り値の型を使用する必要があることに注意してください。 C99は欠落している戻り値の型をサポートしなくなりました。 –

答えて

2

のみGCCはnon-standard extensionとして長さゼロの配列を可能にする(とGCCとの互換性があるいくつかのコンパイラは、それらも可能)。

もちろん、このような配列に何も格納することはできません。したがって、strcpy()の引数としてyearFirstを渡すと、最初の引数であれ2番目の引数であれ、未定義の動作になります。何でも起れる。クラッシュする可能性があります。それは動作するように見えるかもしれません。それをしないでください。アレイにコピーする予定のものを格納するのに十分なスペースを確保してください。これは、Cプログラミングの主要な要件です。それは、このような細部に注意を払う必要のない他の言語を好む人がいる理由の1つです。しかし、Cコンパイラは、義務の怠慢を診断する必要はありません。

+0

参考までに、絶対初心者ガイドをcに読んでください。彼の例はreturn 0を使用しています。また、私の電話を使って書式設定をして、返信して返信してください。だからあなたが言っていることから、私は文字列内の文字の数を考慮する必要があります。私のプログラムが実行される唯一の理由は、新しいgccエンコーダのためにコンパイラが書式設定を受け入れるためです。私はC言語のメモリ共用体を扱うことについて学ぶことはできません。何年もプログラミングに触れておらず、C++で始まっています。私はそれをあまりにも遠くにして、Cを学び、そこから行くことにしました。洞察に感謝します – JNeill

+0

多分、現在の千年紀のすべての悪い習慣を教えている本を使ってはいけません。私はその本を知らないが、あなたがコピーしているコードがそのような欠陥があるなら、あなた自身に好意を持ち、過去10年以内に書かれた本を手に入れてください。 –

+0

Copyright 2014 greg perryとdean millerによって作成されました。第3版。 – JNeill