我和我的一个朋友正在争论这个,所以我们想到了
在这里我们可以得到一个合适的答案,并给出相应的解释。
int a[0];
是a[0]
一个数组,它有什么优势吗?
(我不仅想知道如果我定义a和a [0]会发生什么,但也想知道它的优点以及它不仅仅是变量。)
答案 0 :(得分:4)
作为独立的堆栈变量,它没用。但是,作为结构的最后一个成员,它可以用作可变长度数组,并且这样做曾经是一种常用技术。例如:
struct foo {
int a[0];
};
struct foo* bar = malloc( sizeof *bar + 10 * sizeof *bar->a );
/* now you can (possibly) use bar->a as an array of 10 ints */
请注意,这是一个非标准的,非便携式黑客攻击,在新代码中肯定不是一个好习惯。
答案 1 :(得分:-3)
是的,根据他们的功能而不同。 让我们先进入他们的记忆地址。
int a[0];
printf("%p / %p", &a[0], &a);
您可以测试a[0]
使用与a
相同的地址。
这意味着它们是相同的,但这并不意味着它们的行为是相同的。
这是因为&a
远离a[0]
,这是此处分配的唯一一个内存区域。
然而..尽管有逻辑,a[0]
被视为数组。
很多人说数组需要使用超过1个内存块,但那是错误的。
这是因为索引运算符[]
实际上是一个数组。 (物体的系统排列)
即使对象是这里出现的对象a[0]
,它也被compiller和debug接受为数组。你必须这样做
初始化数组,以防您想要赋值INTO。
有效:
int a[] = {1};
有效:
int a[0] = {1};
无效:
int a[0] = 1;
最重要的是,将指针转换为数组有效,如下所示:
int a[0];
int* p;
p = a;
但是,您不能将p设置为指向一个内存块,而是为数据类型保留。最后,我们有一个指向自身的整数。
结论是编译器/调试和你自己可以像数组一样威胁它,但你不能使用它。
(或者至少期待预测结果)
所有这些意味着a
和a[0]
之间的差异是a
指向其地址的能力。