[기초] C언어 구조체 포인터 관련해서 질문 드립니다.

조회수 803회
#include <stdio.h>
#include <malloc.h>


typedef struct Point2D 
{
    int inint;
    char inchar[10];
};

void structinput(struct Point2D *p, int su) {
    int count = 1;
    for (int i = 0; i < su; i++)
    {
        printf("%d 번째 구조체 정수 입력 : ", count);
        scanf_s("%d", &p[i].inint);
        printf("%d 번째 구조체 문자열 입력 : ", count);
        scanf_s("%c", &p[i].inchar, sizeof(p[i].inchar));
        count++;
        //st[i].total = st[i].kor;
    }
}

void structprint(struct Point2D *p, int su) {
    int count = 1;
    printf("--------- 구조체 결과 --------- \n");
    for (int i = 0; i < su; i++)
    {
        printf("%d 번째 구조체 : %d,\t%s\n", count, p[i].inint, p[i].inchar);
        count++;
    }
    return 0;
}

int main(void) {
    int su;
    printf("구조체 수 입력 :"); 
    scanf_s("%d", &su);

    struct Point2D *p /*= { 0 }*/;
    p = (struct Point2D *)malloc(sizeof(struct Point2D)*su); 

    structinput(&p, su); 
    structprint(&p, su);


}

구조체를 몇 개 생성할지 입력받아 생성하고 그 안에 갚을 함수로 보내 입력한 뒤, 함수로 출력을 해보고 싶었습니다.

포인터 관련하여서 입력부터 corruption이 발생하는데, 이유를 알지 못하겠어서 질문 드립니다.

감사합니다. ;

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 체크해야 할 것이 많네요...최대한 쉽게 적어보면...

    일단 char 배열을 미리 선언했다면 strcpy 류의 함수로 복사해서 넣는 형태로 해야 합니다.

    포인터 연산을 학습중인지는 모르겠지만 우선 (p + 1)->inint 와 같이해서 이해하세요.

    structinput(&p, su); 가 아니라 structinput(p, su); 가 되어야 합니다.

    https://wandbox.org/
    

    상기 사이트에 접속하여 아래 코드로 테스트해보세요.

    #include <stdio.h>
    #include <malloc.h>
    struct Point2D 
    {
        int inint;
        //char inchar[10];
    };
    
    
    void structinput(struct Point2D *p, int su) {
        int count = 1;
        for (int i = 0; i < su; i++){
            printf("%d 번째 구조체 정수 입력 : ", count);
            //scanf_s("%d", &p[i].inint);
            (p + i + 1)->inint = count;
            count++;
            //st[i].total = st[i].kor;
        }
    }
    int main() {
        int su = 5;
    
        struct Point2D *p /*= { 0 }*/;
        p = (struct Point2D *)malloc(sizeof(struct Point2D)*su);
    
        structinput(p, su);
    
        printf("%d\n", (p + 1)->inint);
        printf("%d\n", (p + 2)->inint);
        printf("%d\n", (p + 3)->inint);
        printf("%d\n", (p + 4)->inint);
        printf("%d\n", (p + 5)->inint);
    }
    
  • main 문에서 변수 선언은 가장 위에서 모두 해 주는것이 좋습니다.

    malloc 을 이용해 메모리를 할당하였으면 free 를 이용해 해제도 해주서야 합니다.

    그리고 structinput 함수에서 struct Point2D *p (포인터)를 인자로 받는데,

    structinput(&p, su); 를 보면, 포인터의 주소를 전달하고 있네요.

    아마 거기서 오류가 발생하지 않을까 싶습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)