inflearn logo
강의

講義

知識共有

C を徹底的に学んだ人向けの線形データ構造

動的メモリ割り当てによる連結リストの作成

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

解決済みの質問

160

qee1191617

投稿した質問数 12

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함수로 할당받은 힙메모리 주소가 담겨져 있을 것인데 왜 이런 오류가 발생하는지 궁금합니다.

 

c 코딩-테스트 알고리즘 vc++

回答 2

0

nullnull8537

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

0

communityai8509

안녕하세요, 인프런 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은 포인터 사용 및 메모리 할당 관련 유사 질문에 대한 답변입니다. 자세한 내용은 참고하시면 도움되실 것입니다:

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

05_adtFileIO 개정이력에 대한 질문

0

42

2

마지막 열의 노드를 삭제하였을때 읽기 엑세스 위반 발생 건

0

61

2

첫번째 루프에서 최소값을 못찾았는데 계속 진행하는 이유가 무엇인가요?

0

47

1

[질문]: [섹션4] -> [2중 연결 리스트로 전환] -> [21:30]

0

129

2

인덱스정렬 강의, 04_ListAndIndex질문드립니다.

0

125

1

예제는 어디서 다운로드 받을 수 있나요?

0

178

2

04_MultiIndex 예제에서 질문이 있습니다

0

120

1

헤드노드에 관해..

0

231

3

Event Loop

0

191

1

인덱스정렬 강의, 04_ListAndIndex질문드립니다.

0

192

1

CPU의 다른 이름 Machine 강의 질의

0

273

4

스택의 POP코드 질문드립니다.

0

259

1

adtFileIO 예제코드관련 질문 있습니다.

0

170

1

ADT강의 관련 질문 있습니다.

0

231

2

RangeSearch002 의 singlelist.c 파일 중 질문 있습니다.

0

192

1

섹션4 자료 자체와 정렬된 인덱스 분리 내용 질문

0

252

2

자료 자체와 정렬된 인덱스 분리 강의에서 질문

0

234

2

구현 연습에 대한 개인적 의문

0

279

1

05_adtFileIO 프로젝트 문의

0

318

2

CLI UI적용 강의에서 질문드립니다.

0

333

1

SearchToRemove와 RemoveNode가 분리되어야 할 필요가 있을까요?

0

293

1

05_adtFileIO 프로젝트 문의

0

257

1

자료 자체와 정렬된 인덱스 분리 (인덱스 정렬) - 인덱스 범위 코드에 버그가 있어서 질문 드립니다.

0

304

2

강의자료 관련

0

203

1