“a [0]”是否意味着不只是“a”?

时间:2014-06-02 13:30:47

标签: c arrays

我和我的一个朋友正在争论这个,所以我们想到了 在这里我们可以得到一个合适的答案,并给出相应的解释。 int a[0];a[0]一个数组,它有什么优势吗? (我不仅想知道如果我定义a和a [0]会发生什么,但也想知道它的优点以及它不仅仅是变量。)

2 个答案:

答案 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设置为指向一个内存块,而是为数据类型保留。最后,我们有一个指向自身的整数。 结论是编译器/调试和你自己可以像数组一样威胁它,但你不能使用它。 (或者至少期待预测结果) 所有这些意味着aa[0]之间的差异是a指向其地址的能力。