您现在的位置是:群英 > 开发技术 > 编程语言
C语言数组长度为零可行吗,怎样使用?
Admin发表于 2021-12-23 19:13:051280 次浏览

    C语言数组长度为零可行吗?其实长度为0的数组在标准c和c++中都是不合法的,但是在gcc中确是可行的,那么具体的使用方式是什么呢?下文示例代码有一定的参考价值,需要的朋友可以了解看看,接下来就跟随小编一起学习一下吧。

    在gcc中是可行的。长度为0数组它的最典型的用法就是位于结构体中的最后一项。

使用方式

    如下面的例子,分别使用长度为0的数组和指针声明结构体,实现可变长度的数组功能:

#include <stdio.h>
#include <stdlib.h>
struct test1
{
    int a;
    int b[0];
};
struct test2
{
    int a;
    int *b;
};
struct test3
{
    int a;
    int reserved;//占位符,64位系统中保证结构体字节对齐,test2中是由编译器对齐的,所以两个结构体占用空间相同
    int *b;
};
int main()
{
    struct test1 *var1;
    struct test2 *var2;
    int iLength = 10;
    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) + sizeof(int) * iLength);
    var1->a=iLength;
    for(i=0; i < var1->a; i++)
    {
        var1->b[i]=i;
        printf("var1->b[%d]=%d\t", i, var1->b[i]);
    }
    printf("\n"); 
    printf("p var1 = %p\n", var1);
    printf("p var1->a %p\n", &var1->a);
    printf("var1->b %p\n", var1->b);
    printf("p var1->b %p\n", &var1->b);
    printf("p var1->b[0] %p\n", &var1->b[0]);
    printf("p var1->b[1] %p\n", &var1->b[1]);
    printf("\n\n");
    var2=(struct test2*)malloc(sizeof(struct test2));
    var2->a=iLength;
    var2->b=(int *)malloc(sizeof(int) * iLength);
    for(i=0; i < var2->a; i++)
    {
        var2->b[i]=i;
        printf("var2->b[%d]=%d\t", i, var2->b[i]);
    }
    printf("\n"); 
    printf("p var2 = %p\n", var2);
    printf("p var2->a %p\n", &var2->a);
    printf("var2->b %p\n", var2->b);
    printf("p var2->b %p\n", &var2->b);
    printf("p var2->b[0] %p\n", &var2->b[0]);
    printf("p var2->b[1] %p\n", &var2->b[1]);
    free(var1);
    free(var2->b);
    free(var2);
    return 0;
}

    64位linux系统中运行结果

the length of struct test1:4
the length of struct test2:16
the length of struct test3:16
var1->b[0]=0    var1->b[1]=1    var1->b[2]=2    var1->b[3]=3    var1->b[4]=4    var1->b[5]=5    
var1->b[6]=6    var1->b[7]=7    var1->b[8]=8    var1->b[9]=9
p var1 = 0x55eb1a7d7670
p var1->a 0x55eb1a7d7670
var1->b 0x55eb1a7d7674
p var1->b 0x55eb1a7d7674
p var1->b[0] 0x55eb1a7d7674
p var1->b[1] 0x55eb1a7d7678
var2->b[0]=0    var2->b[1]=1    var2->b[2]=2    var2->b[3]=3    var2->b[4]=4    var2->b[5]=5    
var2->b[6]=6    var2->b[7]=7    var2->b[8]=8    var2->b[9]=9
p var2 = 0x55eb1a7d76b0
p var2->a 0x55eb1a7d76b0
var2->b 0x55eb1a7d76d0
p var2->b 0x55eb1a7d76b8
p var2->b[0] 0x55eb1a7d76d0
p var2->b[1] 0x55eb1a7d76d4

    使用长度为0的数组可以比指针更方便地进行内存的管理。

    结构体test1在分配内存时,则是采用一次分配的原则,一次性将所需的内存全部分配给它,释放也是一次释放。数组和结构体的内存是连续的。

    结构体test2在分配内存时,需采用两步:首先,需为结构体分配一块内存空间;其次再为结构体中的成员变量分配内存空间。这样两次分配的内存是不连续的,需要分别对其进行管理。当使用长度为0的数组时,则是采用一次分配的原则,一次性将所需的内存全部分配给它。相反,释放时也是一样的。

总结

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

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

    对于长度为0的数组元素的访问可正常采用数组方式进行。

    关于C语言数组长度为零的使用方式就介绍到这,上述示例具有一定的借鉴价值,感兴趣的朋友可以参考,希望能对大家有帮助,想要了解更多C语言的内容,大家可以关注其它的相关文章。

文本转载自脚本之家

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-05-12 17:35:24 
摘要:本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于Lambda表达式的相关问题,Lambda表达式在Java语言中引入了一个操作符**“->”**,该操作符被称为Lambda操作符或箭头操作符,下面一起来看一下,希望对大家有帮助
2022-05-11 12:01:38 
摘要:这篇文章主要介绍了YII2 全局异常处理深入讲解,文中列举了异常处理的实例,有感兴趣的同学可以学习下
2022-06-16 09:26:42 
摘要:创建数组的方法:1、利用“$数组名[下标]=值;”语句,以直接赋值的方式创建数组;2、使用“$数组名=array(键名=>值);”语句;3、用array_fill()以填充键值的方式来创建一个新数组;4、用array_combine()等。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部