C语言数组长度为零可行吗,怎样使用?
导读:C语言数组长度为零可行吗?其实长度为0的数组在标准c和c++中都是不合法的,但是在gcc中确是可行的,那么具体的使用方式是什么呢?下文示例代码有一定的参考价值,需要的朋友可以了解看看,接下来就跟随小编一起学习一下吧。在gcc中是可行的。长度...
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语言的内容,大家可以关注其它的相关文章。
文本转载自脚本之家
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: C语言数组长度为零可行吗,怎样使用?
本文地址: https://pptw.com/jishu/655306.html
