GNU/Linux >> Znalost Linux >  >> Linux

valgrind - Adresa ---- je 0 bajtů po bloku o velikosti 8 přiděleného

strcpy přidá nulový ukončovací znak '\0' . Zapomněli jste mu přidělit místo:

*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);

Je třeba přidat mezeru pro 5 znaků:4 pro ".tde" příponu a ještě jednu pro '\0' terminátor. Váš aktuální kód alokuje pouze 4, takže poslední zápis se provede do prostoru bezprostředně za blok, který jste alokovali pro nový název souboru (tj. 0 bajtů za ním).

Poznámka: Váš kód má společný problém – přiřazuje výsledky realloc přímo na ukazatel, který se přerozděluje. To je v pořádku, když realloc je úspěšná, ale při selhání způsobí nevracení paměti. Oprava této chyby vyžaduje uložení výsledku realloc v samostatné proměnné a zkontrolujte, zda obsahuje NULL před přiřazením hodnoty zpět do *filename :

char *tmp = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
if (tmp != NULL) {
    *filename = tmp;
} else {
    // Do something about the failed allocation
}

Přiřazení přímo do *filename vytváří nevracení paměti, protože ukazatel *filename který ukazuje níže, by se při selhání přepsal a stal by se neobnovitelným.


Linux
  1. Zablokujte IP adresu na serveru Linux

  2. Zablokujte IP adresu na serveru Windows

  3. Udržuje realloc zarovnání paměti posix_memalign?

  1. Proč je velikost adresáře v unixu vždy 4096 bajtů?

  2. Dobrá velikost bloku pro klonování disku pomocí diskdump (dd)

  3. Jak snížit velikost swapu poté, co je systém již nainstalován?

  1. Určete velikost blokového zařízení

  2. jak se určuje velikost stránky ve virtuálním adresovém prostoru?

  3. Jak zabránit změně MAC adresy po odpojení?