C++ stack을 구현하는 코드에서 create함수에 관한 질문입니다

조회수 238회
> struct _stack {
    //fill in here
    char* ele;
    int size;
    int top;
};


Stack create(int maxStackSize) {
    //Create an empty stack whose maximum size is maxStackSize
    Stack mathstack;
    mathstack->size = maxStackSize;
    mathstack->top = -1;
    mathstack->ele = (char*)malloc(maxStackSize * sizeof(char));
    return mathstack;
}

이렇게 코드를 작성했는데, 실행 시 초기화되지 않은 메모리 'mathstack'을 사용한다는 경고가 뜹니다. 그래서 'mathstack=0' 라고 초기화를 하면 NULL포인터 'mathstack'을 역참조하고 있습니다는 경고와 함께 작동하지 않습니다. 어떤 부분이 문제가 있는지 알려주실 수 있으신가요... create가 안돼서 진행이 되지 않네요.ㅠㅠ

  • 왠지 첫줄의 _stack을 _Stack으로 바꾸시면 될 거 같은데요? 엽토군 2022.10.2 17:05

1 답변

  • 오류(에러)와 경고는 다릅니다.

    학습용 코드에서는 경고를 반드시 고칠 필요는 없습니다. 경고가 있어도 실행파일이 생성됩니다.

    그러나 에러가 나셨다면 에러는 고치셔야 됩니다. 에러가 있으면 실행파일이 생성되지 않습니다.

    변수(클래스 변수 포함)를 단순 선언하고 사용하면 초기화되지 않은 메모리를 사용한다는 경고가 뜹니다.

    그리고 맬록함수로 메모리를 할당받았을 때에 맬록 함수가 동작 실패한 경우데 대한 처리 코드가 없으면 역참조하고 있다는 경고 메시지가 뜹니다.

    위의 두 경고 모두 실행에 문제가 될만한 것을 아닙니다. 아마도 다른 코드에서 에러가 난 것 같습니다.


    위의 내용과는 별개입니다만, 아래의 코드에 문제가 있습니다.

    Stack mathstack;
    mathstack->size = maxStackSize;
    

    위 코드에서 mathstack은 일반 변수로 선언되었는데, 화살표 연산자(->)로 내부 변수에 접근하고 있는데 화살표 연산자는 포인터 변수의 내부 변수에 접근할 때 사용하는 것입니다. 두번째 줄은 포인터 연산자가 아닌 아래와 같이 점 연산자를 사용해야 합니다.

    mathstack.size = maxStackSize;
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)