D. struct p{ int x; struct p *y;}; 结构类型定义中,每个成员的名称必须唯一。选项A中的结构体p包含两个名为x的成员,因此是错误的。选项B中使用了static关键字来声明静态数组,这是正确的。选项C中将结构体p作为其自身的一个成员,这是递归定义,在C语言中是不允许的。选项D正确地定义了一个指向同类型结构体p的指针成员y。