아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
그리운진도개269
그리운진도개26921.04.28

C언어 중 구조체 포인터가 불완전하다는 오류가 뜹니다.

#include <stdio.h>

struct item {

char name[20];

int price;

};//구조체 선언

int equal(struct item A, struct itme B);//함수 선언

int main() {

struct item a = { "노트북",20000 };//구조체 변수 선언

struct item b = { "스마트폰",10000 };//구조체 변수 선언

printf("* 구조체 포인터를 함수의 인수로 전달하는 프로그램\n");

if (equal(&a, &b) == 1)

printf("\"%s\"과 \"%s\"은 같은 품목입니다",a.name,b.name);

else if(equal(&a,&b)==0)

printf("\"%s\"과 \"%s\"은 다른 품목입니다", a.name, b.name);//if문을 통해 프린트

return 0;

}

int equal(struct item A, struct itme B)

{

if (strcmp(A->name,B->name) == 0)

return 1;

else

return 0;

}

밑줄 친 부분에서 "불완전한 클래스 형식에 대한 포인터는 사용할 수 없습니다."라고 뜨고 또한 "'name'의 왼쪽은 정의되지 않은 구조체/공용 구조체 'item'을(를) 지정합니다." 뜹니다. 정의를 한 것같은데 무슨 문제인지 잘 모르겠습니다

55글자 더 채워주세요.
답변의 개수4개의 답변이 있어요!
  • 안녕하세요~ 해당 코드를 보니 두 구조체 이름이 같은지에 대한 코드로 보이는데요.

    구조체 포인터를 매개변수로 넘기려고 하시려면 equal 함수에 변수를 구조체 포인터로 넘기셔야 합니다.

    int equal(struct item A, struct itme B) -> int equal(struct item *A, struct item *B)으로 변경 // item 오타도 수정해야 합니다^^

    다른 방법으로는 함수 내에서 값을 변경하는 코드가 없는걸로 보여서 구조체 포인터가 아닌 구조체로 넘기시는 방법도 가능합니다^^

    if (equal(&a, &b) == 1) -> (a,b)로 변경

    if (strcmp(A->name,B->name) == 0) -> A.name, B.name으로 변경


  • int equal(struct item A, struct itme B)을

    int equal(struct item* A, struct item* B)

    으로 고쳐보세요. 그리고 현재 코드에 item이 아닌 itme으로 오타가 있습니다.

    변수를 포인터가 아니라 그대로 했기 때문에 stack에 복사가 됩니다.

    즉 현재 equal에 있는 구조체는 포인터가 아니기 때문에 -> 를 쓰시면 안됩니다.

    비쥬얼 스튜디오를 보시면 .을 찍어야 name이 나옵니다.

    변수를 포인터로 넘겨 받게 하면 -> 연산자를 쓰실 수 있고

    비쥬얼 스튜디오에서도 ->로 했을 때 구조체 변수가 나오는 것을 확인할 수 있습니다.


  • 안녕하세요.

    int equal(struct item A, struct itme B)에서 오타가 있습니다.

    struct itme B => struct item B

    이렇게 바꾸고 나서 실행해 보시기 바랍니다.

    그리고 위 코드는 심각한 위험요소를 내포하고 있습니다.

    아래 code와 비교해 보시기 바랍니다.

    #define NAME_LEN 20

    struct item {

    char name[NAME_LEN];

    int price;

    };//구조체 선언

    int equal(struct item A, struct item B)

    {

    if (strncmp(A->name,B->name,NAME_LEN) == 0)

    return 1;

    else

    return 0;

    }


  • 안녕하세요.

    "불완전한 클래스 형식에 대한 포인터는 사용할 수 없습니다." 에러에 대한 질문을 주셨는데요~

    해당 에러는 주로 클래스나 구조체 심볼(이름)의 정의 를 현재 파일 내에서 찾을수 없어서 발생합니다.

    질문주신 코드를 살펴보니,

    equal 함수 파라미터에 오타가 있습니다.

    struct itme B 를

    itme -> item 으로 고쳐주시면 될것 같습니다~