• C语言中数组的长度能不能为0


    C语言中数组的长度能不能为0?

    长度为0的数组在标准C和C++中是不允许的,如果使用长度为0的数组,编译时会产生错误,提示数组长度不能为0。但在GNU

    C中,这种用法却是合法的。它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方便内存缓冲区

    的管理。如果你将上面的长度为0的数组换为指针,那么在分配内存时,需采用两步:首先,需为结构体分配一块内存空间;其

    次再为结构体中的成员变量分配内存空间。这样两次分配的内存是不连续的,需要分别对其进行管理。当使用长度为0的数组时,

    则是采用一次分配的原则,一次性将所需的内存全部分配给它。相反,释放时也是一样的。

    对于长度为的数组,在gcc手册中,有如下一段代码片段:

    struct line 

    {

        int length;

        char contents[0];

    };

    struct line *thisline = (struct line *)malloc (sizeof (struct line) + this_length);

    thisline->length = this_length;

    这段代码的主要含义是定义了一个结构体,并对其进行初始化,上面结构体的第二个成员变量contents[0]事实上是不占内存空间的,

    因此整个结构体的长度sizeof(struct line)为4。当采用malloc为其申请内存空间时,如上所示,申请了一段长度为结构体长度加可变

    长度的内存空间给结构体类型的指针,这时contents就指向申请的可变长度的内存空间。由于是一次申请的,所以这段可变长度的内

    存空间和前面的结构体长度的内存空间是连续的。对于这段可变长度的内存空间,可以采用数组的方式对其进行访问。对于整个结构体,

    当不再使用时,可以使用free函数一次性对其进行释放,而不必像指针那样分别释放。

    示例代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #define  LENGTH   10
    
    struct test1
    {
        int a;
        int *b;
    };
    
    struct test2
    {
        int a;
        int b[0];
    };
    
    struct test3
    {
        int a;
        int b[1];
    };
    
    int main()
    {
        struct test1 *var1;
        struct test2 *var2;
        struct test3 *var3;
        int i;
    
        printf("the length of struct test1:%d\n",sizeof(struct test1));
        printf("the length of struct test2:%d\n",sizeof(struct test2));
        printf("the length of struct test3:%d\n",sizeof(struct test3));
    
        var1=(struct test1*)malloc(sizeof(struct test1));
        var1->a=1;
        var1->b=(int *)malloc(sizeof(int));
        *var1->b=1;
        printf("\nvar1->a=%d,*(var1->b)=%d\n",var1->a,*var1->b);
    
        var2=(struct test2*)malloc(sizeof(struct test2)+sizeof(int)*LENGTH);
        var2->a=2;
        printf("\nvar2->a=%d\n",var2->a);
        for(i=0;i<LENGTH;i++)
        {
            var2->b[i]=i;
            printf("var2->b[i]=%d\t",var2->b[i]);
        }
        printf("\n\n"); 
    
        var3=(struct test3*)malloc(sizeof(struct test3));
        var3->a=3;
        (var3->b)[0]=3;
        printf("var3->a=%d,(var3->b)[0]=%d\n",var3->a,(var3->b)[0]);
    
        free(var1->b);
        free(var1);
        free(var2);
        free(var3);
    }

     输出结果如下:

    从上面的结果可以看出:

    长度为的数组并不占有内存空间,而指针方式需要占用内存空间。

    对于长度为数组,在申请内存空间时,采用一次性分配的原则进行;对于包含指针的结构体,才申请空间时需分别进行,释放时也需分别释放。

    对于长度为的数组的访问可采用数组方式进行。

  • 相关阅读:
    P3015 [USACO11FEB]最好的括号Best Parenthesis
    P1944 最长括号匹配_NOI导刊2009提高(1)
    P2328 [SCOI2005]超级格雷码
    P2308 添加括号
    P5657 格雷码【民间数据】
    P2196 挖地雷
    P5020 货币系统
    括号序列模型--序列dp--U86873 小Y的精灵国机房之旅
    P1033 自由落体
    P1017 进制转换
  • 原文地址:https://www.cnblogs.com/wufengv5/p/3084955.html
Copyright © 2020-2023  润新知