Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的互指结构 请解释这些结构声明-它们有效吗 这类声明是否适用?如果适用,你能举个例子吗 这些是自指结构吗_C - Fatal编程技术网

C语言中的互指结构 请解释这些结构声明-它们有效吗 这类声明是否适用?如果适用,你能举个例子吗 这些是自指结构吗

C语言中的互指结构 请解释这些结构声明-它们有效吗 这类声明是否适用?如果适用,你能举个例子吗 这些是自指结构吗,c,C,它在过程语言(如C)中无效且不需要。(在执行惰性计算的语言中可能很有用,例如:Haskell) 想象一下您的示例的一个用例 struct A { struct B b; }; struct B { struct A a; }; 但有时您需要将A和B类型的结构相互引用,在这种情况下,您可以使用指针 struct A { struct B b; }; struct B { struct A a; }; Struct A a; a.b.a.b.a.b.......[inf

它在过程语言(如
C
)中无效且不需要。(在执行惰性计算的语言中可能很有用,例如:
Haskell

想象一下您的示例的一个用例

struct A { 
    struct B b;
};
struct B {
    struct A a;
};
但有时您需要将
A
B
类型的结构相互引用,在这种情况下,您可以使用指针

struct A { 
  struct B b;
};
struct B {
  struct A a;
};
Struct A a;
a.b.a.b.a.b.......[infinitely]
现在,可能的用例是:

struct child;
struct parent;

struct child { 
  ...
  struct parent *pParent;
};

struct parent {
  ...
  struct child *children[2];
};
C
中,字段不能有[a],但允许字段作为指向不完整类型的指针

关于自引用结构,使用指针,可以实现此要求

struct child pikachu;
...
if(pikachu.pParent != NULL) {
  struct child *pPikachuSibling;
  pPikachuSibling = (pikachu.pParent.children[0] == &pikachu) ?
                           pikachu.pParent.children[1] :
                           pikachu.pParent.children[0];
  if(pPikachuSibling != NULL) {
    do_something_with(pPikachuSibling);
  }
}

[a] 引用自
ISO/IEC 9899:TC2委员会草案-2005年5月6日WG14/N1124

109)不完整类型只能在不需要该类型对象的大小时使用。事实并非如此 例如,当typedef名称被声明为结构或联合的说明符时,或者 声明指向结构或联合的指针或返回结构或联合的函数时。(参见不完整类型) 在调用或定义此类函数之前,必须完成规范

6.2.5类型

22大小未知的数组类型是不完整的类型。它是 对于该类型的标识符,通过在 后期声明(具有内部或外部链接)。结构或 未知内容的联合类型(如6.7.2.3所述)是 不完整类型。对于该类型的所有声明, 通过声明与其定义内容相同的结构或联合标记 后来在同一范围内


试着想象一下如果你能做到这一点会发生什么。它的大小将是无限的。@RetiredInja或零大小!为什么?假设你没有回答某类测验,你需要为这个问题添加一些上下文以使其有意义,并且比你的一些努力更能让问题被接受。因此,使用口袋妖怪+1。
assert( pikachu.pParent.children[0] == &pikachu) ||
        pikachu.pParent.children[1] == &pikachu) );