본문 바로가기
카테고리 없음

C언어 오류의 해석 (컴파일러, 경고, 디버그)

by info95686 2025. 10. 3.

C언어 오류의 해석
C언어 오류의 해석

C언어를 처음 배우는 사람이라면 누구나 컴파일 에러 메시지를 보고 당황한 경험이 있을 것입니다. 에러 메시지는 단순히 "코드가 잘못되었다"는 알림이 아니라, 어떤 부분에서 문제가 생겼는지를 알려주는 중요한 힌트입니다. 하지만 초보자 입장에서는 "expected ‘;’ before ‘}’ token" 같은 문장이 낯설고 어렵게 느껴지기도 합니다. 이번 글에서는 C언어에서 자주 발생하는 컴파일러 오류, 경고 메시지, 디버그 시점의 해석법을 구체적인 사례와 함께 정리해 보겠습니다.

컴파일러 오류 메시지 이해하기

C언어 프로그램을 작성하면 소스 코드를 컴파일러가 기계어로 변환합니다. 이 과정에서 문법이 잘못되거나 자료형이 맞지 않으면 컴파일러가 오류 메시지를 출력합니다. 대표적인 오류 사례를 살펴보겠습니다.

1. 세미콜론 누락 오류

#include <stdio.h>

int main() {
    printf("Hello World!")  // 세미콜론 누락
    return 0;
}

error: expected ‘;’ before ‘return’return 앞에 세미콜론이 빠졌다는 의미

2. 변수 선언 오류

#include <stdio.h>

int main() {
    num = 10;  // 선언 없이 사용
    printf("%d\n", num);
    return 0;
}

error: ‘num’ undeclared (first use in this function) → 선언되지 않은 변수를 사용했다는 뜻

3. 자료형 불일치 오류

#include <stdio.h>

int main() {
    int a = "text";
    return 0;
}

warning: initialization of ‘int’ from ‘char *’ makes integer from pointer without a cast → 문자열을 정수형 변수에 대입하려는 잘못된 코드

이처럼 expected, undeclared, incompatible 같은 키워드에 집중하면 오류 메시지를 쉽게 이해할 수 있습니다.

경고 메시지와 그 의미

컴파일러는 오류뿐 아니라 경고(warning) 메시지도 출력합니다. 경고는 컴파일은 가능하지만 실행 중 오류로 이어질 수 있는 위험한 코드를 알려줍니다. 무시하지 말고 반드시 점검해야 합니다.

1. 초기화되지 않은 변수 사용

#include <stdio.h>

int main() {
    int a;
    printf("%d\n", a);
    return 0;
}

warning: ‘a’ is used uninitialized in this function → 초기화되지 않은 변수 사용

2. 형 변환 손실 경고

#include <stdio.h>

int main() {
    double pi = 3.14159;
    int x = pi;
    printf("%d\n", x);
    return 0;
}

warning: conversion from ‘double’ to ‘int’ loses precision → 소수점 이하 손실 경고

3. 사용되지 않는 변수

#include <stdio.h>

int main() {
    int count = 0;
    printf("Hello\n");
    return 0;
}

warning: unused variable ‘count’ → 사용되지 않는 변수는 삭제 권장

디버그 시 메시지 해석과 해결

프로그램이 컴파일은 되지만 실행 중 오류가 발생하는 경우가 있습니다. 이를 런타임 에러라고 하며, 세그멘테이션 오류나 버퍼 오버플로우가 대표적입니다.

1. 세그멘테이션 오류 (Segmentation fault)

#include <stdio.h>

int main() {
    int *p = NULL;
    *p = 10;  // 잘못된 메모리 접근
    return 0;
}

Segmentation fault (core dumped) → 잘못된 메모리 접근으로 인한 충돌

2. 버퍼 오버플로우

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

int main() {
    char buf[5];
    strcpy(buf, "HelloWorld");  // 크기 초과
    return 0;
}

*** stack smashing detected *** → 배열 크기를 초과해 복사하면서 스택 손상

3. 논리적 오류

for (int i = 0; i >= 0; i++) {
    printf("%d\n", i);
}

무한 루프 발생 → 실행은 되지만 끝나지 않는 논리적 오류

런타임 에러를 해결하려면 단순히 메시지를 읽는 것에서 그치지 않고 GDB 같은 디버거를 활용해 코드 흐름을 추적하는 습관이 필요합니다.

결론: 에러 메시지는 최고의 선생님

C언어에서 발생하는 에러와 경고 메시지는 프로그램을 올바르게 작성하도록 돕는 중요한 가이드입니다.

  • 컴파일러 오류 → 문법 및 선언 문제
  • 경고 메시지 → 실행 중 위험 요소 사전 경고
  • 런타임 에러 → 메모리 접근, 로직 오류

초보자는 에러 메시지를 무시하거나 두려워하지 말고, 키워드 중심으로 해석하며 원인을 찾는 습관을 가져야 합니다. 이를 통해 디버깅 능력이 향상되고, 견고한 코드를 작성할 수 있습니다.