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

배승혁님의 프로필 이미지
배승혁

작성한 질문수

독하게 C를 배운 사람을 위한 선형 자료구조

메모리 동적 할당 기반 연결 리스트 생성하기

AddNewNode 함수 구현시 질문입니다.

해결된 질문

작성

·

35

·

수정됨

0

void AddNewNode(int age, char pszName, char pszPhone){

USERDATA* pNewNode = (USERDATA*)malloc(sizeof(USERDATA));

pNewNode->age = age;

strcpy_s(pNewNode->name, sizeof(pNewNode->name), pszName);

strcpy_s(pNewNode->phone, sizeof(pNewNode->phone), pszPhone);

pNewNode->pNext = NULL;

강사님 위 코드 볼드체부분에서 pNewNode 포인터값이 널값임에 따라 역참조 경고가 발생합니다.

그러나 제 생각에는 malloc함수로 할당받은 힙메모리 주소가 담겨져 있을 것인데 왜 이런 오류가 발생하는지 궁금합니다.

 

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

부분적인 코드만 보고 결과를 말하기는 어렵습니다. 해서 몇 가지 추측만으로 답변을 드리겠습니다. 우선 malloc() 함수가 실패할 가능성이 별로 높지 않다는 점입니다. pNewNode가 null임에 따라 참조 오류가 발생한다고 판단한 근거도 명확하지가 않습니다. 아무튼 지금 상황은 분석이 더 필요하며 관련해 Call stack 정보를 꼭 확인해보시라 권하고 싶습니다. 응용 프로그램이 멈춘 표면적 이유는 마지막 코드가 아니라 그 직전 다른 코드가 원인일 수 있습니다. 이 점 참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다.

배승혁님, 질문에 답변드리겠습니다. malloc 함수를 사용하여 메모리를 할당하고 pNewNodeNULL을 가리키는 오류가 발생하는 경우, 일반적으로 두 가지 원인 중 하나일 수 있습니다.

  1. 메모리 할당 실패: 시스템의 메모리가 부족하거나 다른 이유로 인해 malloc이 메모리 할당에 실패하면 NULL을 반환합니다. 따라서 항상 malloc 후에 반환값이 NULL인지 체크하는 것이 중요합니다. 예를 들어, 다음과 같이 코드를 수정하면 안전하게 사용할 수 있습니다:

    USERDATA* pNewNode = (USERDATA*)malloc(sizeof(USERDATA));
    if (pNewNode == NULL) {
       // 메모리 할당 실패 처리
       fprintf(stderr, "메모리 할당 실패\n");
       return; // 또는 다른 적절한 오류 처리
    }
    
  2. 타입 오류: USERDATA 구조체가 정의되어 있지 않거나, 컴파일러가 이를 인식하지 못하는 경우 발생할 수 있습니다. 이를 방지하려면 USERDATA 구조체가 제대로 정의되어 있고, 해당 소스 파일에 포함되어 있는지 확인해야 합니다.

배승혁님이 제안해주신 코드에서는 malloc로 할당된 메모리의 포인터가 정상적으로 pNewNode에 저장되었다면, pNewNode를 바로 역참조했을 때는 문제가 없어야 합니다. 그러나 malloc이 예기치 않게 NULL을 반환한 경우나, 다른 쪽에서 포인터 값을 변경한 상황 등이 있을 수 있습니다.

기본적으로 malloc 사용 후에는 위와 같이 NULL 체크를 습관화하면 많은 문제를 예방할 수 있습니다.

아래 URL은 포인터 사용 및 메모리 할당 관련 유사 질문에 대한 답변입니다. 자세한 내용은 참고하시면 도움되실 것입니다:

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

배승혁님의 프로필 이미지
배승혁

작성한 질문수

질문하기