Correggi l'errore del puntatore non valido gratuito in C

Jinku Hu 12 ottobre 2023
  1. Non liberare i puntatori che puntano a posizioni di memoria non dinamiche
  2. Non liberare puntatori che sono già stati liberati
Correggi l'errore del puntatore non valido gratuito in C

Questo articolo introdurrà diversi metodi su come correggere l’errore del puntatore non valido free in C.

Non liberare i puntatori che puntano a posizioni di memoria non dinamiche

La chiamata alla funzione free dovrebbe essere usata solo per deallocare la memoria dai puntatori che sono stati restituiti dalle funzioni malloc, calloc o realloc. Il codice seguente mostra lo scenario in cui al puntatore char* viene assegnato un valore restituito dalla chiamata malloc, ma più avanti nel blocco else, lo stesso puntatore viene riassegnato con una stringa letterale. Ciò significa che la variabile c_str punta alla posizione che non è una regione di memoria dinamica; quindi, non è consentito passare alla funzione free. Di conseguenza, quando viene eseguito il prossimo esempio, e il programma raggiunge la chiamata della funzione free, viene interrotto e viene visualizzato l’errore free(): invalid pointer.

Si noti che non si dovrebbero riassegnare i puntatori a posizioni di memoria dinamica con indirizzi diversi a meno che non vi siano altre variabili di puntatore che puntano ancora alla posizione originale. Infine, dovresti chiamare la funzione free solo sui puntatori che puntano alla memoria.

#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);
}

Non liberare puntatori che sono già stati liberati

Un altro errore comune quando si utilizza la memoria dinamica è chiamare la funzione free sui puntatori che sono già stati liberati. Questo scenario è molto probabile quando sono presenti più variabili di puntatore che puntano alla stessa area di memoria dinamica. Nell’esempio di codice riportato di seguito viene illustrato uno di questi casi possibili, in cui la stessa posizione viene liberata in diversi ambiti.

Si noti che questo esempio è un programma breve in un unico file e sarà facile diagnosticare un problema come questo, ma nelle basi di codice più grandi, potrebbe essere difficile rintracciare la fonte senza programmi di ispezione esterni che eseguono analisi statiche.

#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);
}
Autore: 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

Articolo correlato - C Pointer