strcpy()数组声明?

时间:2016-09-27 06:49:55

标签: c arrays

我只是将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;
}

1 个答案:

答案 0 :(得分:2)

只有GCC允许零长度数组作为non-standard extension(并且一些与GCC兼容的编译器也允许它们)。

当然,你不能在这样的数组中存储任何东西,所以将yearFirst作为参数传递给strcpy() - 无论是第一个还是第二个参数 - 都会导致未定义的行为。任何事情都可能发生。可能会崩溃;它甚至可能看起来有效。不要这样做。确保分配足够的空间来存储计划复制到阵列中的任何内容。这是C编程的主要要求;这就是为什么有些人更喜欢其他语言而不必注意这种细节的原因。但是C编译器不需要诊断你的失职。