해결된 질문
작성
·
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
함수를 사용하여 메모리를 할당하고 pNewNode
가 NULL
을 가리키는 오류가 발생하는 경우, 일반적으로 두 가지 원인 중 하나일 수 있습니다.
메모리 할당 실패: 시스템의 메모리가 부족하거나 다른 이유로 인해 malloc
이 메모리 할당에 실패하면 NULL
을 반환합니다. 따라서 항상 malloc
후에 반환값이 NULL
인지 체크하는 것이 중요합니다. 예를 들어, 다음과 같이 코드를 수정하면 안전하게 사용할 수 있습니다:
USERDATA* pNewNode = (USERDATA*)malloc(sizeof(USERDATA));
if (pNewNode == NULL) {
// 메모리 할당 실패 처리
fprintf(stderr, "메모리 할당 실패\n");
return; // 또는 다른 적절한 오류 처리
}
타입 오류: USERDATA
구조체가 정의되어 있지 않거나, 컴파일러가 이를 인식하지 못하는 경우 발생할 수 있습니다. 이를 방지하려면 USERDATA
구조체가 제대로 정의되어 있고, 해당 소스 파일에 포함되어 있는지 확인해야 합니다.
배승혁님이 제안해주신 코드에서는 malloc
로 할당된 메모리의 포인터가 정상적으로 pNewNode
에 저장되었다면, pNewNode
를 바로 역참조했을 때는 문제가 없어야 합니다. 그러나 malloc
이 예기치 않게 NULL
을 반환한 경우나, 다른 쪽에서 포인터 값을 변경한 상황 등이 있을 수 있습니다.
기본적으로 malloc
사용 후에는 위와 같이 NULL
체크를 습관화하면 많은 문제를 예방할 수 있습니다.
아래 URL은 포인터 사용 및 메모리 할당 관련 유사 질문에 대한 답변입니다. 자세한 내용은 참고하시면 도움되실 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.