没有长度的数组
2006-05-09 17:16
288 查看
有人说C语言是一个很诡异的语言,所以有时候我们会见到一些比较奇怪的定义,比如:
struct A{
int a;
int data[]
};
这个看起来确实很奇怪,为什么数组没有定义大小呢?
但实际上这段代码不仅可以通过大部分编译器,并且用途还很广泛。我工作的时候就遇到了不少这样的代码,并且还是比较关键的代码。
不过实际上事情并没有那么复杂和难以理解,不用看那些复杂的关于零长度数组是否符合C标准,以及不完整类型等等没见过的名词,其实道理很简单,C也不会专门为了这个而搞出来很复杂的规则。
让我们来看看,什么地方还会用到这样类似的东东:
int f(int array[])
{
...
}
int main(void)
{
int a[10];
...
f(a);
...
}
想想看,是不是一样的道理?
int a[]无论怎么用,都是一个意思,就是说明a是一个数组,但是不知道它的大小。
当然在struct A的定义中,与这里还是有些不同的,因为int data[]并没有占用实际的空间,sizeof(struct A) = 2(或者是4,依赖于平台)。
另外,int data[0]在有些编译器上也可以通过,并且和int data[]具有相同的效果,所以上面的结构体声明可能看起来象下面这样:
struct A{
int a1;
int data[0];
};
这种写法不推荐使用,因为不符合C的标准,而且看起来更怪更难以理解。
引用别人的一个例子,就可以更深入的理解了:
#include "stdio.h"
#include "stdlib.h"
struct A{
short a1;
short next[0];
} * pA = NULL;
struct B{
short a1;
short next[1];
};
main()
{
short abc[10];
int i;
printf("sizeof(struct A)=%d, sizeof(short)=%d, sizeof(struct B)=%d/r/n", sizeof(struct A), sizeof(short), sizeof(struct B));
for (i=0; i<10; i++) abc[i] = i;
pA = (struct A * ) abc;
for (i=0; i<10; i++) {
printf("i: %d, i.next:%d/r/n", pA->a1, pA->next[0]);
pA++;
/*
注意与的不同,下面的语句要考虑到入栈的顺序,i和i.next的输出是相同的
printf("i: %d, i.next:%d/r/n", pA->a1, pA++->next[0]);
*/
};
getch();
}
注:例子来源于http://www.etcell.com/soft/topicView.aspx?Id=38200,我是用baidu的cache看到的,看不到作者的名字,就不写了,大家看到了帮忙告诉我,我写上。另外,代码修改了一句,以便突出重点。
struct A{
int a;
int data[]
};
这个看起来确实很奇怪,为什么数组没有定义大小呢?
但实际上这段代码不仅可以通过大部分编译器,并且用途还很广泛。我工作的时候就遇到了不少这样的代码,并且还是比较关键的代码。
不过实际上事情并没有那么复杂和难以理解,不用看那些复杂的关于零长度数组是否符合C标准,以及不完整类型等等没见过的名词,其实道理很简单,C也不会专门为了这个而搞出来很复杂的规则。
让我们来看看,什么地方还会用到这样类似的东东:
int f(int array[])
{
...
}
int main(void)
{
int a[10];
...
f(a);
...
}
想想看,是不是一样的道理?
int a[]无论怎么用,都是一个意思,就是说明a是一个数组,但是不知道它的大小。
当然在struct A的定义中,与这里还是有些不同的,因为int data[]并没有占用实际的空间,sizeof(struct A) = 2(或者是4,依赖于平台)。
另外,int data[0]在有些编译器上也可以通过,并且和int data[]具有相同的效果,所以上面的结构体声明可能看起来象下面这样:
struct A{
int a1;
int data[0];
};
这种写法不推荐使用,因为不符合C的标准,而且看起来更怪更难以理解。
引用别人的一个例子,就可以更深入的理解了:
#include "stdio.h"
#include "stdlib.h"
struct A{
short a1;
short next[0];
} * pA = NULL;
struct B{
short a1;
short next[1];
};
main()
{
short abc[10];
int i;
printf("sizeof(struct A)=%d, sizeof(short)=%d, sizeof(struct B)=%d/r/n", sizeof(struct A), sizeof(short), sizeof(struct B));
for (i=0; i<10; i++) abc[i] = i;
pA = (struct A * ) abc;
for (i=0; i<10; i++) {
printf("i: %d, i.next:%d/r/n", pA->a1, pA->next[0]);
pA++;
/*
注意与的不同,下面的语句要考虑到入栈的顺序,i和i.next的输出是相同的
printf("i: %d, i.next:%d/r/n", pA->a1, pA++->next[0]);
*/
};
getch();
}
注:例子来源于http://www.etcell.com/soft/topicView.aspx?Id=38200,我是用baidu的cache看到的,看不到作者的名字,就不写了,大家看到了帮忙告诉我,我写上。另外,代码修改了一句,以便突出重点。
相关文章推荐
- java运行长度10000的数组堆栈溢出,c++和Delphi都没有
- 1到100,放在长度99的数组里,有一个没有在里面,编程找出那个数
- 【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)
- 找到给定数组中出现次数大于长度一半的数字,若没有,则返回0
- 1到100,放在长度99的数组里,有一个没有在里面,编程找出那个数
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- java中申请不定长度数组ArrayList
- 结构体0长度数组的作用
- 实现求出若干整数之和为500的连续整数(如98,99,100,101,102)的所有组合&&产生一个int数组,长度为100,并向其中随机插入1~100,要求不能重复
- 结构体最后的长度为0或者1的数组
- List的All方法使用问题:我用List1的All方法来确保List1的所有每个数组元素中是否包含Arr1中的任意元素,这个部分很难实现。 因为,没有一个数组中是否包含另一个数组中的任意元素这个功能
- C/C++中如何获取数组的长度?
- C语言获得数组长度的函数
- 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值
- 线程解决:一个长度的30000的int数组,其中放随机数,利用多核的优势,求数组中元素的和
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 数组与字符串长度sizeof()、strlen()、string的length()和size()
- 为什么多维数组必须声明列数,而对行数没有要求???
- 需要排序的最短子数组的长度
- C/C++ 获取数组的有效长度