int var []和int var [0]之间有什么区别

时间:2013-11-08 07:00:13

标签: c struct

在以下两个结构定义中,它们之间有什么区别?

struct A {
    int var[];
};

struct B {
    int var[0];
};

struct C {
    int *var;
};

我认为在使用这些结构的情况下,它们是相同的。 他们背后有特殊意义吗?

4 个答案:

答案 0 :(得分:4)

AB之间的区别在于第二个是非法的。在标准C中,指定0作为大小的数组声明始终是无条件非法的。如果编译器接受此声明,则它是编译器的非标准扩展。

同时,A中的数组声明是一个C99特性,它在结构的末尾声明了一个灵活的数组成员。

C内的声明是一个指针声明。 AB声明数组成员,C声明指针成员。那么,这就是你的不同之处。

P.S。如果您的编译器接受B的定义,那么它确实可能与A的定义相同。

答案 1 :(得分:2)

 int var[] -> variable length array 

 int var[0] -> does not have any element in the array // Illegal

 int *var -> it is an integer pointer that can store the address of integer
              or base address of array of integers

 var[] VS *var

  var[] -> array of integers, 

           var[0],var[1] -> this is how you access elements of array

   *var -> needs initiailization of an address of an integer before it is used

        1) int *var = &a; // if you have one integer             
        2) int *var = &a[0] // if you have array of integers save base address
            var[1] or *(++var) // both are equivalent

The advantage of integer pointer over integer array is to return an int pointer
      in function calls because retuning array of integers is not possible

数组必须至少包含1个元素。您的int var[0]不是定义数组长度的有效方法。 int var[1]有效

答案 2 :(得分:0)

正如其他人所指出的,第二次声明是不合法的。这个技巧通常用于可变大小的结构。

通过声明大小为1的数组,可以以合法的方式实现相同。

This question可以帮助您了解它。

要了解详情,请访问variable sized structurevariable length structure

答案 3 :(得分:0)

虽然零长度数组在C中是非法的,但它们在GCC中受支持。您可以在http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

找到与您的问题相关的一些信息