구조체 포인터 배열 관련 문의

조회수 771회

안녕하세요.

strcpy(lp[1]->korea, "o"); 이 부분에서 에러가 발생하는데 원인이 뭔가요?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct{
    char korea[20];
} test;

int main()
{
    test *lp[3];

    for(int i=0; i<sizeof(lp)/sizeof(test); i++)
    {
        lp[i] = malloc(sizeof(test));
    }

    strcpy(lp[0]->korea, "k");
    strcpy(lp[1]->korea, "o");
    printf("%s", *lp);
    return 0;
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 다른 부분의 코드의 의도는 모르겠는데

    for문에서

    for(int i=0; i<sizeof(lp)/sizeof(test); i++)
    {
        lp[i] = malloc(sizeof(test));
    }
    

    의도는 3번을 반복하는 것 같은데 실제로 1번 밖에 실행되지 않습니다.

    왜냐믄 분모인 sizeof(test)가 20인데

    분자인 sizeof(lp)는 8 * 3 = 24가 나오기 때문이죠.

    lp는 test 구조체의 포인터를 배열로 가지고 있는 변수입니다. 때문에 20byte 3개가 아니라 포인터의 크기인 8byte가 3개 들어 있어요.

    결국 for문 종료 조건인 size check 결과가 항상 (int)1로 casting이 되기 때문에 아래에서 lp[1] 메모리에 접근하려고 하자마자 segmentation fault 11 에러가 납니다. 동적 할당되었기 때문에 런타임에 에러가 나는 것이고요.

    에러가 안 나는 방향으로 작성해 보자면

    //for(int i=0; i<sizeof(lp)/sizeof(*lp); i++)
    //{
    //    lp[i] = malloc(sizeof(test));
    //}
    //
    // 아.. 코드 수정합니다. 정확하게는 아래가 맞을 듯?
    for(int i=0; i<sizeof(lp)/sizeof(test *); i++)
    {
        lp[i] = malloc(sizeof(test));
    }
    

    이렇게 되지 않을까요?

    • 자세히 보니 for 문에 연산이 있었군요. 연산이 잘못되었네요. 정영훈 2018.9.18 01:37
    • 우와~ 바로 문제가 해결되었습니다. 대입 부분이 문제가 아니라 for문이 문제였군요 ㅠㅠ 감사합니다! 알 수 없는 사용자 2018.9.18 06:11
  • lp[i] = malloc(sizeof(test));
    

    에서 컴파일 오류 발생하지 않나요?

    lp[i] = (test*)malloc(sizeof(test));
    

    와 같이 형변환을 해줘야 합니다.

    • 음.. 아니요 strcpy(lp[1]->korea, "o"); 이 부분에서 에러가 뜨네요. seg fault,..ㅠㅠ 알 수 없는 사용자 2018.9.17 20:44

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

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

(ಠ_ಠ)
(ಠ‿ಠ)