인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

홍정모의 따라하며 배우는 C언어

14.9 구조체와 할당 메모리

cleanup() 함수 부분에서 문제가 발생하는데 해결법을 모르겠어요

24.08.14 15:15 작성

·

53

1

#define CRTSECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define SLEN 81

struct namect

{

char* fname;

char* lname;

int letters;

};

void getinfo(struct namect*); //allocate memory

void makeinfo(struct namect*);

void showinfo(const struct namect*);

void cleanup(struct namect*); // free memory when done

int main(void)

{

//구조체의 멤버로 할당 메모리를 사용하기

//할당 메모리를 가리키는 포인터를 구조체의 멤버로 사용

struct namect p = { "Gil DONG","Hong",SLEN };

//char buffer[SLEN] = { 0, };

//int f2 = scanf("%[^\n]%*c", buffer);

//p.fname = (char*)malloc(strlen(buffer) + 1); //null character 자리 1개 추가.

//if (p.fname != NULL)

// strcpy(p.fname, buffer);

//printf("%s %s\n", p.fname, p.lname);

getinfo(&p);

makeinfo(&p);

showinfo(&p);

cleanup(&p);

return 0;

}

void getinfo(struct namect* adr)

{

char buffer1[SLEN] = { 0. };

char buffer2[SLEN] = { 0, };

printf("input your first name:\n>>");

int f1 = scanf("%[^\n]%*c", buffer1);

if (f1 != 1)

printf("Wrong input!\n");

else

{

adr->fname = (char*)malloc(strlen(buffer1 + 1));

if (adr->fname != NULL)

strcpy(adr->fname, buffer1);

else

printf("Malloc Failed!!\n");

}

printf("input your last name:\n>>");

int f2 = scanf("%[^\n]%*c", buffer2);

if (f2 != 1)

printf("Wrong input!\n");

else

{

adr->lname = (char*)malloc(strlen(buffer2 + 1));

if (adr->lname != NULL)

strcpy(adr->lname, buffer2);

else

printf("Malloc Failed!!\n");

}

}

void makeinfo(struct namect* adr)

{

adr->letters = strlen(adr->fname) + strlen(adr->lname);

}

void showinfo(const struct namect* adr)

{

printf("Hi, %s %s. Your name has %d characters.",

adr->fname,

adr->lname,

adr->letters);

}

void cleanup(struct namect* adr)

{

free(adr->fname);

free(adr->lname);

}

스크린샷 2024-08-14 151016.png

윗 분이 남겨주신 질의응답으로 해결 가능할 것으로 생각했으나 step over로 찍어봐도 free()에서 자꾸만 문제가 발생합니다...

답변 2

1

Soobak님의 프로필 이미지

2024. 08. 15. 00:31

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

첨부해주신 코드 중,
getinfo() 함수안에서 malloc() 함수를 호출하는 부분에 오타가 있으시네요.

void getinfo(struct namect* adr)
{
  char buffer1[SLEN] = { 0. };
  char buffer2[SLEN] = { 0, };
  printf("input your first name:\n>>");
  int f1 = scanf("%[^\n]%c", buffer1);
  if (f1 != 1)
    printf("Wrong input!\n");
  else
  {
    adr->fname = (char)malloc(strlen(buffer1 + 1)); // 이 부분
    if (adr->fname != NULL)
      strcpy(adr->fname, buffer1);
    else
      printf("Malloc Failed!!\n");
  }
  printf("input your last name:\n>>");
  int f2 = scanf("%[^\n]%c", buffer2);
  if (f2 != 1)
    printf("Wrong input!\n");
  else
  {
    adr->lname = (char)malloc(strlen(buffer2 + 1)); // 이 부분
    if (adr->lname != NULL)
      strcpy(adr->lname, buffer2);
    else
      printf("Malloc Failed!!\n");
  }
}

: 주석으로 표시드린 부분을 참고하시어,
(char)malloc(strlen(buffer1 + 1)); 에서의 괄호 위치를 (char)malloc(strlen(buffer1) + 1) 과 같이 수정하시면 올바르게 동작할 것입니다.

오타로 인하여 의도한 크기의 메모리를 동적으로 할당하지 못하여 런타임 중 에러가 발생하는 것입니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 08. 14. 15:21

안녕하세요, 인프런 AI 인턴입니다. 강진성님의 질문에 대해 도움을 드릴 수 있을 것 같은 관련 내용을 찾았습니다.

질문하신 cleanup() 함수와 관련, 메모리 할당 및 해제에서 발생하는 문제, 특히 free() 함수를 호출할 때 나타나는 heap corruption 문제를 다루는 케이스와 유사한 상황의 답변 링크를 찾았습니다. 이는 할당한 메모리 크기가 예상보다 작을 때, 또는 이미 해제된 메모리에 접근할 때 발생할 수 있습니다.

다음 링크에서는 유사한 문제를 와 해결법을 제공합니다:

  • 연습문제를 동적할당으로 해보는중에 질문 있습니다
    • 이 링크에서 제공되는 답변에서는 heap corruption detected 오류가 발생하는 상황에 대해 설명해 줍니다. 할당한 메모리 공간보다 더 큰 영역에 데이터를 쓰려고 하면 이 오류가 발생할 수 있습니다. 문제의 원인과 해결 방안에 대한 구체적인 설명이 포함되어 있어 유사한 문제에 마주한 경우 해결하는 데 도움이 될 수 있습니다.

질문하신 상황에서 strlen 함수 사용 시 +1 처리가 올바르게 되었는지도 확인해 보시는 것이 좋습니다. 예를 들어, strlen(buffer1 + 1) 대신 strlen(buffer1) + 1로 수정해야 합니다. 이는 널 문자를 위한 추가 공간을 확보하기 위함입니다.

또한 별도의 오류 메시지나 특이 사항 없이 free() 함수 호출 시 문제가 발생한다면, 동적으로 할당된 메모리의 영역을 넘어서는 접근이 있었는지, 또는 이미 해제된 메모리를 다시 해제하려는 시도는 없었는지 등을 점검해 보시는 것이 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기