C 동적할당(malloc, free) 질문 드립니다.
글쓴이: kaki2981 / 작성시간: 수, 2018/12/05 - 12:42오후
struct info { char s[256]; int len; int words; }; int main(void) { struct info* inputs = (struct info*) malloc(sizeof(struct info)*n); for (int i = 0; i < n + 1; i++) { char str[256]; gets(str); for (int j = 0; j < strlen(str); j++) inputs[i].s[j] = str[j]; inputs[i].len = strlen(str); inputs[i].words = CountWords(str); // CountWords는 return int } free(inputs); return 0; }
main 함수에서 질문과 관련있다고 생각하는 부분만 올렸습니다.
제가 이해하는 malloc의 용법은 다음과 같습니다.
sizeof(info)*n 만큼의 크기를 임시로 할당받습니다. 이 힙 영역에 해당하는 주소값을 inputs가 가지고 있습니다.
inputs를 통해서 malloc으로 할당받은 공간에서 작업한 후, free(inputs)으로 그 공간을 해제합니다.
위 코드대로 실행하면 free(inputs)에서 inputs이 공간을 제대로 참조하고 있지 못한 것과 같은 오류가 발생합니다.
inputs를 통해 할당된 공간으로 접근했다고 생각했는데 어디서 잘못됐는지 잘 모르겠습니다.
Forums:
보통 이렇게 하지 않나요?
보통 이렇게 하지 않나요?
감사합니다.
올려주신대로 해볼게요! 감사합니다.
할당된 공간은 구조체 n개 분량인데, for 루프는
할당된 공간은 구조체 n개 분량인데, for 루프는 i값 0부터 n까지 총 n+1번 반복하고 있네요.
좋은 하루 되세요!
감사합니다.
그 부분도 이상했었네요. 감사합니다!
올려주신 코드 빌드해봐도 오류가 재현이 안 됩니다.
올려주신 코드 빌드해봐도 오류가 재현이 안 됩니다. 여러 개의 구조체를 한덩어리로 할당해서쓰고 읽다가 해제하는, 문제없는 사용방식같습니다. 포인터연산 대신 배열형식으로 쓰고 있을 뿐이죠.
위에서 지적된 n + 1 --> n 이어야 하는 부분과, 문자열끝의 널문자까지 복사하기 위해 j < strlen(str) --> j <= strlen(str) 이어야 하는 점이 눈에 띄지만, 실행해봐도 free()에서 오류가 생기지는 않았습니다.
뭔가 문제를 겪었기 때문에 질문하신 것일테니, 같은 오류가 재현되는 샘플을 만들어보셔야 문제가 확인되겠습니다.
입력 샘플 중 라인당 256문자 이상이라면, gets
입력 샘플 중 라인당 256문자 이상이라면, gets()에서 문제가 생깁니다. 일반적으로 gets()는 "절대" 사용하지 말아야 하는 함수입니다.
정말 그렇네요 맨 페이지에도 친절히 설명
정말 그렇네요 맨 페이지에도 친절히 설명 되어있네요
댓글 달기