在以下两个结构定义中,它们之间有什么区别?
struct A {
int var[];
};
struct B {
int var[0];
};
struct C {
int *var;
};
我认为在使用这些结构的情况下,它们是相同的。 他们背后有特殊意义吗?
答案 0 :(得分:4)
A
和B
之间的区别在于第二个是非法的。在标准C中,指定0
作为大小的数组声明始终是无条件非法的。如果编译器接受此声明,则它是编译器的非标准扩展。
同时,A
中的数组声明是一个C99特性,它在结构的末尾声明了一个灵活的数组成员。
C
内的声明是一个指针声明。 A
和B
声明数组成员,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 structure
或variable length structure
。
答案 3 :(得分:0)
虽然零长度数组在C中是非法的,但它们在GCC中受支持。您可以在http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
找到与您的问题相关的一些信息