문제상황:
실무에서 사용될 수 있는 C언어 코드를 작성 중 다음과 같은 에러가 발생했습니다. 아래 코드에서 에러가 발생한 부분과 에러 로그를 확인해봅시다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse_string(char *str) {
int length = strlen(str);
char *temp = (char *)malloc(sizeof(char) * (length + 1));
for (int i = 0; i < length; i++) {
temp[length - i - 1] = str[i];
}
strcpy(str, temp);
}
int main() {
char *input = "Hello, C!";
reverse_string(input);
printf("Reversed string: %s\n", input);
return 0;
}
에러로그 내용:
Segmentation fault (core dumped)
해결방법:
에러가 수정된 코드와 수정된 부분에 대한 주석을 확인해봅시다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse_string(char *str) {
int length = strlen(str);
char *temp = (char *)malloc(sizeof(char) * (length + 1));
for (int i = 0; i < length; i++) {
temp[length - i - 1] = str[i];
}
temp[length] = '\0'; // 널 종료 문자 추가
strcpy(str, temp);
free(temp); // 동적 할당 해제
}
int main() {
char input[] = "Hello, C!"; // 문자열 변경이 가능한 배열로 선언
reverse_string(input);
printf("Reversed string: %s\n", input);
return 0;
}
원인분석:
에러 발생 원인은 "Segmentation fault (core dumped)"로, 메모리 접근 권한 오류입니다. 이 에러는 다음과 같은 원인들 때문에 발생했습니다.
- char *input = "Hello, C!";는 문자열 변경이 불가능한 문자열 리터럴을 가리키는 포인터입니다. 이를 변경 가능한 배열로 수정해야 합니다.
- reverse_string 함수에서 temp 문자열에 널 종료 문자를 추가하지 않았습니다. 이를 수정해야 합니다.
- reverse_string 함수에서 동적으로 할당한 메모리를 해제하지 않았습니다. 이를 수정해야 합니다.
참고링크:
728x90