Freien ungültigen Zeiger-Fehler in C beheben

Jinku Hu 12 Oktober 2023
  1. Keine free-Zeiger, die auf nicht-dynamische Speicherplätze zeigen
  2. Keine Zeiger freigeben, die bereits freigegeben wurden
Freien ungültigen Zeiger-Fehler in C beheben

Dieser Artikel stellt mehrere Methoden vor, wie man den free Fehler für ungültige Zeiger in C beheben kann.

Keine free-Zeiger, die auf nicht-dynamische Speicherplätze zeigen

Der Funktionsaufruf free sollte nur verwendet werden, um Speicher von Zeigern freizugeben, die von den Funktionen malloc, calloc oder realloc zurückgegeben wurden. Der folgende Code zeigt das Szenario, in dem dem Zeiger char* ein vom malloc-Aufruf zurückgegebener Wert zugewiesen wird, aber später im else-Block wird derselbe Zeiger mit einem String-Literal neu zugewiesen. Das bedeutet, dass die Variable c_str auf eine Stelle zeigt, die kein dynamischer Speicherbereich ist; daher darf sie nicht an die Funktion free übergeben werden. Wenn das nächste Beispiel ausgeführt wird und das Programm den Aufruf der Funktion free erreicht, wird es abgebrochen und der Fehler free(): invalid pointer wird angezeigt.

Beachten Sie, dass man die Zeiger auf dynamische Speicherplätze mit anderen Adressen nicht neu zuweisen sollte, es sei denn, es gibt noch andere Zeigervariablen, die auf den ursprünglichen Speicherplatz zeigen. Schließlich sollten Sie die Funktion free nur für Zeiger aufrufen, die auf Heap-Speicher zeigen.

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

Keine Zeiger freigeben, die bereits freigegeben wurden

Ein weiterer häufiger Fehler bei der Verwendung des dynamischen Speichers ist der Aufruf der free-Funktion auf Zeiger, die bereits freigegeben wurden. Dieses Szenario ist am wahrscheinlichsten, wenn es mehrere Zeigervariablen gibt, die auf denselben dynamischen Speicherbereich zeigen. Der folgende Beispielcode demonstriert einen solchen möglichen Fall, in dem dieselbe Stelle in verschiedenen Bereichen freigegeben wird.

Beachten Sie, dass es sich bei diesem Beispiel um ein kurzes Programm mit einer einzigen Datei handelt, und dass es einfach sein wird, ein solches Problem zu diagnostizieren, aber bei größeren Codebases könnte es schwierig sein, die Quelle ohne externe Inspektionsprogramme, die eine statische Analyse durchführen, zu finden.

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

Verwandter Artikel - C Pointer