C에서 잘못된 포인터 오류 수정
이 기사에서는 C에서free
유효하지 않은 포인터 오류를 수정하는 방법에 대한 여러 방법을 소개합니다.
비 동적 메모리 위치를 가리키는 자유가 아닌 포인터
free
함수 호출은 malloc
, calloc
또는 realloc
함수에서 반환 한 포인터에서 메모리 할당을 해제하는 데만 사용해야합니다. 다음 코드는char *
포인터에malloc
호출에서 반환 된 값이 할당되지만 나중에else
블록에서 동일한 포인터가 문자열 리터럴로 재 할당되는 시나리오를 보여줍니다. 이것은c_str
변수가 동적 메모리 영역이 아닌 위치를 가리킴을 의미합니다. 따라서 free
함수에 전달할 수 없습니다. 결과적으로 다음 예제가 실행되고 프로그램이 free
함수 호출에 도달하면 중단되고 free(): invalid pointer
오류가 표시됩니다.
원래 위치를 가리키는 다른 포인터 변수가없는 한 다른 주소를 가진 동적 메모리 위치에 포인터를 재 할당해서는 안됩니다. 마지막으로 힙 메모리를 가리키는 포인터에서만 free
함수를 호출해야합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char *c_str = NULL;
size_t len;
if (argc != 2) {
printf("Usage: ./program string\n");
exit(EXIT_FAILURE);
}
if ((len = strlen(argv[1])) >= 4) {
c_str = (char *)malloc(len);
if (!c_str) {
perror("malloc");
}
strcpy(c_str, argv[1]);
printf("%s\n", c_str);
} else {
c_str = "Some Literal String";
printf("%s\n", c_str);
}
free(c_str);
exit(EXIT_SUCCESS);
}
이미 해제된 포인터 자유 사용 안 함
동적 메모리를 사용할 때 또 다른 일반적인 오류는 이미 해제 된 포인터에 대해 free
함수를 호출하는 것입니다. 이 시나리오는 동일한 동적 메모리 영역을 가리키는 여러 포인터 변수가있을 때 가장 가능성이 높습니다. 다음 샘플 코드는 동일한 위치가 다른 범위에서 해제되는 한 가지 가능한 경우를 보여줍니다.
이 예제는 단일 파일 짧은 프로그램이며 이와 같은 문제를 쉽게 진단 할 수 있지만 더 큰 코드베이스에서는 정적 분석을 수행하는 외부 검사 프로그램없이 소스를 추적하기 어려울 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char *c_str = NULL;
size_t len;
if (argc != 2) {
printf("Usage: ./program string\n");
exit(EXIT_FAILURE);
}
char *s = NULL;
if ((len = strlen(argv[1])) >= 4) {
c_str = (char *)malloc(len);
s = c_str;
if (!c_str) {
perror("malloc");
}
strcpy(c_str, argv[1]);
printf("%s\n", c_str);
free(c_str);
} else {
c_str = "Some Literal String";
printf("%s\n", c_str);
}
free(s);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook