ieșire exactă liberă () în C?

voturi
0

Am vrut să întreb, dacă am un pointer indică la un struct, dar apoi am liber (struct), apoi, dacă am endiancu indicatorul, va fi îndreptat NULL? Ca și în pot verifica, indicatorul! = NULL sau este nedefinită?

Mulțumiri!

Întrebat 08/08/2012 la 22:44
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
0

Este nedefinit. C nu definește ceea ce face cu conținutul pointerul, deși cele mai multe implementari nu fac nimic.

Publicat 08/08/2012 la 22:48
sursa de către utilizator

voturi
2

Apelarea gratuit () pe indicatorul nu se modifică valoarea indicatorului. Se va indica în continuare la aceeași memorie care nu mai face parte din cererea dumneavoastră. Trebuie să atribuiți întotdeauna NULL la un pointer free'd imediat după ce îl liber pentru a se asigura că nu-l utilizați din nou.

void *p = malloc(10);    // p points to allocated memory
free(p);                 // p still points to invalid memory
p = NULL;                // good practice
Publicat 08/08/2012 la 22:49
sursa de către utilizator

voturi
-1

Aruncati o privire la această pagină.

Se spune clar:

Observați că această funcție lasă valoarea PTR neschimbată, prin urmare, în continuare către același (acum nu este validă) Locul de amplasare, și nu la indicatorul nul.

Rețineți că este de până la tine să vă asigurați că indicatorul nu este dereferentierea după ce a fost eliberat.

Publicat 08/08/2012 la 23:01
sursa de către utilizator

voturi
1

Luați în considerare codul de mai jos

int main()
{
    int *p = (int *)malloc(sizeof(int) * 10);
    free(p);
}

Aici variabila p este o variabilă locală a unei funcții main. Mărimea acestei variabile va fi de 4 octeți (în 32bit m / c) sau 8 octeți (în 64 de biți m / c). Acum suntem alocarea de memorie pentru stocarea de 10 elemente întregi și că adresa este stocată în variabila p. Acum , facem apel funcția liberă la care ne trec adresa de memorie dinamică , care este stocată în variabila locală p. Acum , funcția liberă va elibera memoria și nu va fi în măsură să atribuie NULLla variabila p. Pentru că am trecut adresa ca valoare, nu referire la indicatorul.

Putem defini o funcție înveliș pentru freeca mai jos

void myfree(void **p)
{
    free(*p);
    *p = NULL;
}

int main()
{
    int *p = (int *)malloc(sizeof(int) * 10);
    myfree(&p);
}

Sau putem defini, de asemenea, funcția de macro

#define MYFREE(x) \
        free(x); \
        x = NULL; 
Publicat 09/08/2012 la 01:07
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more