programing

C 프로그래밍:불완전한 유형 오류에 대한 참조 취소 포인터

batch 2023. 6. 10. 08:34
반응형

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;
...

(참고로, 사용 시 주의하시기 바랍니다.strncpyNUL 종료가 보장되지 않습니다.)

이유는 유형을 선언하지 않고 대신 구조 변수를 정의했기 때문입니다.

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

반응형