문제상황:
C 언어를 사용하여 파일을 읽고 쓰기를 하는 간단한 프로그램을 작성하는 과정에서, 파일을 열고 닫는 과정에서 에러가 발생했습니다. 아래는 에러가 발생한 코드와 해당 상황에 대한 설명입니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
char *buffer;
size_t result;
file = fopen("example.txt", "r");
if (file == NULL) {
fputs("파일 열기 실패", stderr);
exit(1);
}
fseek(file, 0, SEEK_END);
long fileSize = ftell(file);
rewind(file);
buffer = (char *)malloc(sizeof(char) * fileSize);
if (buffer == NULL) {
fputs("메모리 할당 실패", stderr);
exit(2);
}
result = fread(buffer, 1, fileSize, file);
if (result != fileSize) {
fputs("파일 읽기 실패", stderr);
exit(3);
}
fclose(file);
printf("%s\n", buffer);
return 0;
}
에러로그 내용:
Segmentation fault (core dumped)
해결방법:
에러가 수정된 코드와 수정된 부분에 대한 주석은 아래와 같습니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
char *buffer;
size_t result;
file = fopen("example.txt", "r");
if (file == NULL) {
fputs("파일 열기 실패", stderr);
exit(1);
}
fseek(file, 0, SEEK_END);
long fileSize = ftell(file);
rewind(file);
buffer = (char *)malloc(sizeof(char) * (fileSize + 1)); // 수정: 버퍼 크기를 fileSize + 1로 변경하여 NULL 문자를 위한 공간 확보
if (buffer == NULL) {
fputs("메모리 할당 실패", stderr);
exit(2);
}
result = fread(buffer, 1, fileSize, file);
if (result != fileSize) {
fputs("파일 읽기 실패", stderr);
exit(3);
}
fclose(file);
buffer[fileSize] = '\0'; // 수정: 문자열의 끝에 NULL 문자 추가
printf("%s\n", buffer);
free(buffer); // 수정: 동적 메모리 할당 해제
return 0;
}
원인분석:
에러 발생 원인은 동적 메모리 할당된 버퍼에 문자열의 끝을 표시하는 NULL 문자를 추가하지 않아 발생한 것입니다. 이로 인해 printf 함수에서 문자열의 끝을 찾지 못하고 메모리 영역을 넘어가게 되어 Segmentation fault가 발생했습니다. 이를 해결하기 위해 버퍼 크기를 fileSize + 1로 변경하여 NULL 문자를 위한 공간을 확보하고, 문자열의 끝에 NULL 문자를 추가했습니다. 이렇게 수정한 결과, 프로그램이 정상적으로 실행되고 예상대로 파일의 내용을 출력할 수 있었습니다.
또한, 동적으로 할당한 메모리를 사용한 뒤 해제하지 않았기 때문에 메모리 누수가 발생할 수 있는 문제를 발견했습니다. 이 문제를 해결하기 위해 프로그램의 마지막 부분에 free(buffer)를 추가하여 메모리를 해제했습니다.
이러한 원인과 해결 방법을 통해, 해당 에러를 수정하고 프로그램을 정상적으로 작동시킬 수 있었습니다.
참고링크:
- Segmentation fault 관련 설명: https://man7.org/linux/man-pages/man7/signal.7.html
- C 언어 파일 입출력 함수: https://www.tutorialspoint.com/cprogramming/c_file_io.htm
- 동적 메모리 할당 및 해제: https://www.geeksforgeeks.org/dynamic-memory-allocation-in-c-using-malloc-calloc-free-and-realloc/
728x90