모두의 코드 커뮤니티

C언어로 연결 리스트를 만들다가 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int DataType;

typedef struct _NODE
{
    DataType      data;
    struct _NODE* link;
} Node, * ENode;

ENode InitList(ENode head);
void DestList(ENode head);
void ShowList(ENode head);

int main(int argc, const char* argv[])
{
    ENode head;

    head = InitList(head);

    ENode node1 = (ENode) malloc(sizeof(Node));
    node1->data = 10;
    node1->link = head->link;
    head->link  = node1;

    ShowList(head);

    DestList(head);

    return 0;
}



ENode InitList(ENode head)
{
    head = (ENode) malloc(sizeof(Node));
    head->link = NULL;

    return head;
}

void DestList(ENode head)
{
    if (head == NULL) return;

    ENode now = head->link;

    while (now != NULL)
    {
        ENode next = now->link;

        free(now);

        now = next;
    }

    free(head);
}

void ShowList(ENode head)
{
    if (head == NULL) return;

    ENode now = head->link;

    while (now != NULL)
    {
        printf("%d ", now->data);
        now = now->link;
    }
    puts("");
}

연결 리스트의 오류를 고민하다가 질문을 드립니다.

InitList 함수를 반환값이 void와 ENode로 둘 다 만들었는데, 전자는 코드가 실행되지 않고 후자는 실행되는 것을 알 수 있었습니다. ENode인 경우는 이해했지만, void의 경우, 아무것도 리턴하지 않아도 함수 안에서 동적 할당이 이루어졌기 때문에 원래 주소값이 정해지지 않았던 main의 head 노드에 주소값이 할당되어 그 후 코드들이 잘 작동할 줄 알았습니다.

결국 main의 head 노드의 주소값이 함수의 반환값에 따라 오류가 나거나 잘 작동하는데, 동적 할당을 했음에도 왜 오류가 나는지 알고 싶습니다.

좋아요 1

이전 글에서도 답변하였는데 함수에 리턴 타입이 void 인 것 자체는 문제가 되지 않습니다.

하지만 리턴 타입이 void 인 함수의 리턴값을 사용하면 안됩니다. (애초에 컴파일 오류가 발생하지 않았나요? 적어도 경고라도)