자기 참조 구조 정의?
C를 쓴 지 얼마 안 돼서 이런 재귀적인 일을 어떻게 해야 할지...각 셀에 다른 셀을 포함시키고 싶은데 "field 'child' has incomplete type" 행에 오류가 나타납니다.무슨 일입니까?
typedef struct Cell {
int isParent;
Cell child;
} Cell;
것은 ★★★★★Cell
이상 참을 수 Cell
끝없는 재귀가 되기 때문입니다.
, a,Cell
에는 다른 can른에 대한 될 수 있습니다.Cell
.
typedef struct Cell {
bool isParent;
struct Cell* child;
} Cell;
C에서는 구조 자체를 사용하여 작성하는 typedef를 참조할 수 없습니다.다음 테스트 프로그램과 같이 구조물 이름을 사용해야 합니다.
#include <stdio.h>
#include <stdlib.h>
typedef struct Cell {
int cellSeq;
struct Cell* next; /* 'tCell *next' will not work here */
} tCell;
int main(void) {
int i;
tCell *curr;
tCell *first;
tCell *last;
/* Construct linked list, 100 down to 80. */
first = malloc (sizeof (tCell));
last = first;
first->cellSeq = 100;
first->next = NULL;
for (i = 0; i < 20; i++) {
curr = malloc (sizeof (tCell));
curr->cellSeq = last->cellSeq - 1;
curr->next = NULL;
last->next = curr;
last = curr;
}
/* Walk the list, printing sequence numbers. */
curr = first;
while (curr != NULL) {
printf ("Sequence = %d\n", curr->cellSeq);
curr = curr->next;
}
return 0;
}
하겠지만, about about knowing 、 although 、 표 、 about 、 about 、 about 、 about 、 about 、 고 、 about 、 about 、 about about 、 about 。struct Cell
typedef
tCell
마지막 줄까지 :-) 그렇게 기억하고 있습니다.
이 문제를 해결할 방법이 있습니다.
struct Cell {
bool isParent;
struct Cell* child;
};
struct Cell;
typedef struct Cell Cell;
이렇게 선언하면 컴파일러에 Structure Cell과 Plain-ol'-cell이 동일하다는 것을 알립니다.그래서 당신은 평상시와 같이 셀을 사용할 수 있습니다.다만, 초기 선언 자체에 structure Cell을 사용해야 합니다.
또 다른 편리한 방법은 구조 태그를 사용하여 다음과 같이 구조물을 미리 타이핑하는 것입니다.
//declare new type 'Node', as same as struct tag
typedef struct Node Node;
//struct with structure tag 'Node'
struct Node
{
int data;
//pointer to structure with custom type as same as struct tag
Node *nextNode;
};
//another pointer of custom type 'Node', same as struct tag
Node *node;
이 투고가 오래되었다는 것은 알지만, 원하는 효과를 얻으려면 다음 사항을 시도해 보십시오.
#define TAKE_ADVANTAGE
/* Forward declaration of "struct Cell" as type Cell. */
typedef struct Cell Cell;
#ifdef TAKE_ADVANTAGE
/*
Define Cell structure taking advantage of forward declaration.
*/
struct Cell
{
int isParent;
Cell *child;
};
#else
/*
Or...you could define it as other posters have mentioned without taking
advantage of the forward declaration.
*/
struct Cell
{
int isParent;
struct Cell *child;
};
#endif
/*
Some code here...
*/
/* Use the Cell type. */
Cell newCell;
위의 코드 프래그먼트에서 언급된 두 가지 경우 중 어느 경우든 자녀 셀 구조를 포인터로 선언해야 합니다.그렇지 않으면 "field 'child' has incomplete type" 오류가 나타납니다.그 이유는 "구조 셀"을 정의해야 컴파일러가 사용할 때 할당해야 할 공간의 양을 알 수 있기 때문입니다.
"구조 셀"의 정의에 "구조 셀"을 사용하려고 하면 컴파일러는 "구조 셀"이 얼마나 많은 공간을 차지해야 하는지 아직 알 수 없습니다.그러나 컴파일러는 포인터가 차지하는 공간이 얼마나 되는지 이미 알고 있으며 (전방 선언을 통해) "셀"이 "구조 셀"의 한 종류라는 것을 알고 있습니다(그러나 "구조 셀"이 얼마나 큰지는 아직 모릅니다).따라서 컴파일러는 정의되는 구조 내에 "Cell *"를 정의할 수 있습니다.
이전의 답변은 모두 훌륭합니다.왜 구조가 (참조가 아닌) 자신의 유형의 인스턴스를 포함할 수 없는지에 대한 이해를 돕기 위해서입니다.
구조가 '값' 타입이라는 것에 주목하는 것은 매우 중요합니다.즉, 실제 값을 포함하고 있기 때문에 구조를 선언할 때 컴파일러는 그 인스턴스에 할당하는 메모리의 양을 결정해야 합니다.따라서 모든 구성원을 통과하고 구조의 모든 메모리에 대한 정보를 얻기 위해 메모리를 합산하지만 컴파일러가 instanc를 발견했을 경우같은 구조의 e는 패러독스입니다(즉, A의 메모리 구조를 알기 위해서는 A의 메모리 구조가 얼마나 되는지를 결정해야 합니다!).
그러나 레퍼런스 타입은 다릅니다.구조체 'A'가 자신의 타입의 인스턴스에 대한 '레퍼런스'를 포함하고 있는 경우, 어느 정도의 메모리가 할당되어 있는지는 아직 알 수 없지만, 메모리 주소(즉, 레퍼런스)에 할당되어 있는지는 알 수 있습니다.
HTH
이론적인 관점에서, 언어는 자기포용 구조가 아닌 자기반복적 구조만을 지원할 수 있다.
typedef의 기본 정의에 대해 살펴보겠습니다.typedef를 사용하여 기존 데이터 유형에 대한 별칭을 정의합니다.
typedef <data_type> <alias>;
예를들면
typedef int scores;
scores team1 = 99;
여기에서는 이전에 정의되지 않은 동일한 데이터 유형의 구성원으로 인해 자기 참조 구조와 혼동됩니다.따라서 표준적인 방법으로 코드를 :- 로 쓸 수 있습니다.
//View 1
typedef struct{ bool isParent; struct Cell* child;} Cell;
//View 2
typedef struct{
bool isParent;
struct Cell* child;
} Cell;
//Other Available ways, define stucture and create typedef
struct Cell {
bool isParent;
struct Cell* child;
};
typedef struct Cell Cell;
그러나 마지막 옵션에서는 보통 하고 싶지 않은 행과 단어를 몇 개 더 늘립니다(우리는 너무 게으릅니다). 따라서 View 2를 선호합니다.
그 자체에 대한 참조를 포함하는 구조물.링크 리스트의 노드를 기술하는 구조에서 흔히 볼 수 있는 현상입니다.각 노드에는 체인의 다음 노드에 대한 참조가 필요합니다.
struct node
{
int data;
struct node *next; // <-self reference
};
언급URL : https://stackoverflow.com/questions/588623/self-referential-struct-definition
'programing' 카테고리의 다른 글
Java String 배열: 메서드의 크기가 있습니까? (0) | 2022.08.29 |
---|---|
하위 컴포넌트에서 부모 메서드를 호출합니다(Vue.js). (0) | 2022.08.29 |
vuex에서 반응하지 않는 getter (0) | 2022.08.29 |
플렉스-컬럼을 사용하여 다른 항목을 고정하는 동안 하나의 플렉스박스 항목만 스크롤 (0) | 2022.08.29 |
문자 포인터가 int*에서 캐스트된 후 유효하지 않은 값을 가리키고 있습니다. (0) | 2022.08.29 |