首先考虑以下简单程序:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
struct {
int len;
char *str;
} *p;
p = malloc( sizeof( *p ) );
p->str = "Hello Nihal Jain";
p->len = strlen( p->str );
while ( *p->str ) putchar( *p->str++ );
putchar( '\n' );
free( p );
return 0;
}
它的输出是
Hello Nihal Jain
所以在这个声明中
struct {
int len;
char *str;
} *p;
这里声明了一个未命名结构体类型的指针。指针本身没有被初始化。例如,您可以写
struct {
int len;
char *str;
} *p = malloc( sizeof( *p ) );
对于这个简单的程序,结构体的名称并不是必需的,因为程序中不存在或不需要声明结构体类型的对象。
所以在这种情况下,您无法声明结构体类型的对象,但这并不是必需的。
根据C标准,结构体或联合体声明如下:
struct-or-union-specifier:
struct-or-union identifier
opt { struct-declaration-list }
struct-or-union identifier
可以看出,如果存在struct-declaration-list,则标识符是可选的。因此,可以使用未命名的结构体作为类型说明符。
再举一个使用枚举的例子。您可以声明枚举器而不声明枚举类型。例如:
enum { EXIT_SUCCESS = 0, EXIT_FAILURE = -1 }
如果程序没有这样的要求,您可以使用具有类型为int
的枚举器而无需声明枚举类型的对象。
p
是指向该匿名结构体的指针。 - Some programmer dude