0

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

struct A {
    int var[];
};

struct B {
    int var[0];
};

struct C {
    int *var;
};

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

4

4 回答 4

4

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

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

里面的声明C是一个指针声明。AB声明数组成员,C声明一个指针成员。所以,这就是你的区别。

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

于 2013-11-08T07:02:08.340 回答
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]已验证

于 2013-11-08T07:01:39.103 回答
0

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

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

这个问题可以帮助你理解它。

要了解更多信息,请 googlevariable sized structurevariable length structure.

于 2013-11-08T07:08:54.087 回答
0

虽然零长度数组在 C 中是非法的,但它们在 GCC 中受支持。您的问题的一些相关信息可在此处获得http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

于 2013-11-08T07:23:31.023 回答