C 프로그래밍:불완전한 유형 오류에 대한 참조 취소 포인터
다음과 같이 정의된 구조가 있습니다.
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
이러한 구조체에 대한 포인터 배열:
struct stasher_file *files[TOTAL_STORAGE_SIZE];
내 코드에서는 구조체에 포인터를 만들어 구성원을 설정하고 배열에 추가합니다.
...
struct stasher_file *newFile;
strncpy(newFile->name, name, 32);
newFile->size = size;
newFile->start = first_free;
newFile->popularity = 0;
files[num_files] = newFile;
...
다음 오류가 발생합니다.
오류: 불완전한 형식에 대한 참조 해제 포인터
내가 안에 있는 멤버들에게 접근하려고 할 때마다.newFile
내가 뭘 잘못하고 있는 거지?
정의하지 않았습니다.struct stasher_file
당신의 첫 번째 정의에 따르면.정의한 것은 이름 없는 구조 유형과 변수입니다.stasher_file
그런 종류의다음과 같은 유형에 대한 정의가 없기 때문입니다.struct stasher_file
당신의 코드에서 컴파일러는 불완전한 유형에 대해 불평합니다.
정의하기 위해struct stasher_file
당신은 그것을 다음과 같이 했어야 합니다.
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
다음 위치를 기록합니다.stasher_file
이름이 정의에 배치됩니다.
포인터를 사용하고 있습니다.newFile
공간을 할당하지 않습니다.
struct stasher_file *newFile = malloc(sizeof(stasher_file));
또한 구조물 이름을 맨 위에 넣어야 합니다.stasher_file을 지정한 곳은 해당 구조체의 인스턴스를 만드는 곳입니다.
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
실제로 구조를 어떻게 정의했습니까?한다면
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
유형 정의로 간주됩니다. 누락되었습니다.typedef
위와 같이 쓰면 실제로 다음과 같은 변수를 정의할 수 있습니다.stasher_file
익명 구조체 유형의 사람입니다.
해라
typedef struct { ... } stasher_file;
(또는 다른 사람들이 이미 언급한 바와 같이):
struct stasher_file { ... };
후자는 실제로 사용자가 사용하는 유형과 일치합니다.첫 번째 양식은 다음을 제거해야 합니다.struct
변수 선언 전에.
위의 경우는 새로운 프로젝트를 위한 것입니다.저는 잘 구축된 도서관의 포크를 편집하던 중 이 오류를 발견했습니다.
typedef는 제가 편집하던 파일에 포함되어 있었지만 구조는 포함되어 있지 않았습니다.
결과적으로 제가 잘못된 곳에서 구조를 편집하려고 했습니다.
유사한 방법으로 이 문제가 발생할 경우 구조가 편집된 다른 위치를 찾아 해당 위치에서 시도해 보십시오.
이 오류가 발생하는 이유는 다음과 같은 오류를 선언했기 때문입니다.struct
다음과 같이:
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
이것은 다음을 선언하는 것이 아닙니다.stasher_file
유형. 익명을 선언하는 것입니다. struct
이름이 지정된 글로벌 인스턴스를 만들고 있습니다.stasher_file
.
당신이 의도한 것은 다음과 같습니다.
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
Brian R 동안에 주의하세요.본디의 응답은 당신의 오류 메시지에 대해 정확하지 않았습니다. 그가 옳습니다. 당신이 메시지에 쓰려고 하는 것은.struct
공간을 할당하지 않아도 됩니다.포인터 배열을 원하는 경우struct stasher_file
구조물, 당신이 전화해야 할 것입니다.malloc
합니다.
struct stasher_file *newFile = malloc(sizeof *newFile);
if (newFile == NULL) {
/* Failure handling goes here. */
}
strncpy(newFile->name, name, 32);
newFile->size = size;
...
(참고로, 사용 시 주의하시기 바랍니다.strncpy
NUL 종료가 보장되지 않습니다.)
그 이유는 유형을 선언하지 않고 대신 구조 변수를 정의했기 때문입니다.
C
구조 선언:
struct structure-tag {
member1
member2
...
};
structure-tag
는키드뒤에오는선이름다니입택적워▁the▁keyword▁following다▁optional▁name▁an▁is에 이은 선택적 이름입니다.struct
선언 후 변수를 정의할 수 있습니다.
struct structure-tag var1, *var2;
또한 선언과 정의를 모두 수행할 수 있습니다.
struct structure-tag {
member1
member2
...
} var1, *var2;
따라서 귀하의 경우 다음과 같이 시도할 수 있습니다.
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
} *files[TOTAL_STORAGE_SIZE];
struct stasher_file *newFile = malloc(sizeof(struct stasher_file));
... other code ...
이상입니다.
언급URL : https://stackoverflow.com/questions/2576554/c-programming-dereferencing-pointer-to-incomplete-type-error
'programing' 카테고리의 다른 글
Microsoft Excel에서 사용할 수 있도록 숫자를 C# 문자로 변환 (0) | 2023.06.10 |
---|---|
프로그래밍 방식으로 UI 버튼에 터치 이벤트를 위장하는 방법은 무엇입니까? (0) | 2023.06.10 |
Typescript/Vue - Prop의 기본 개체를 선언할 때 vuex 저장소에 액세스하려면 어떻게 해야 합니까? (0) | 2023.06.10 |
프로젝트의 루트 디렉터리에서 텍스트 파일을 읽는 방법은 무엇입니까? (0) | 2023.06.10 |
루비에서 &.(앰퍼샌드 도트)는 무엇을 의미합니까? (0) | 2023.06.05 |