在下面的两个结构定义中,它们之间有什么区别?
struct A {
int var[];
};
struct B {
int var[0];
};
struct C {
int *var;
};
我认为在使用这些结构的情况下,它们是相同的。它们背后有什么特殊含义吗?
A
和之间的区别在于B
第二个是非法的。指定为大小的数组声明0
在标准 C 中总是无条件非法的。如果您的编译器接受此声明,则它是您的编译器的非标准扩展。
同时,数组声明A
是一个 C99 特性,它在结构的末尾声明一个灵活的数组成员。
里面的声明C
是一个指针声明。A
并B
声明数组成员,C
声明一个指针成员。所以,这就是你的区别。
PS 如果您的编译器接受 的定义B
,那么它确实很可能与 的定义相同A
。
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]
已验证
正如其他人所指出的,第二次声明是不合法的。这个技巧通常用于可变大小的结构。
同样可以通过声明大小为 1 的数组以合法的方式实现。
这个问题可以帮助你理解它。
要了解更多信息,请 googlevariable sized structure
或variable length structure
.
虽然零长度数组在 C 中是非法的,但它们在 GCC 中受支持。您的问题的一些相关信息可在此处获得http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html