C에서 잘못된 포인터 오류 수정

Jinku Hu 2023년10월12일
  1. 비 동적 메모리 위치를 가리키는 자유가 아닌 포인터
  2. 이미 해제된 포인터 자유 사용 안 함
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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C Pointer