C Распределение памяти, перезапись после освобождения - PullRequest
0 голосов
/ 01 октября 2018

Я застрял в вопросе о распределении памяти, особенно о том, что происходит после операторов free ().Так, например, когда я освобождаю a и затем изменяю его адрес, будет ли все еще иметь старое значение или он получит адрес b?Становится ли висячий указатель, потому что я настраиваю его после освобождения?Выходные данные просто будут a и b с одинаковыми значениями, z-20 и w = 9?Буду признателен за любую помощь.Большое спасибо!

int* t = (int*) malloc(sizeof(int)); 
int* b = (int*)    malloc(sizeof(int)); 
int* a = (int*) malloc(sizeof(int)); 
int w;
int z;

*a = 11;
*b = 9;
z = *a + *b; 
w = *b;
*a = z; 
free(a);

*t = 4;
b = &z;
a = b; 
free(t);

printf("Printed results are:\n");
printf("*a=%d, *b=%d, z=%d, w=%d\n", *a, *b, z, w);

1 Ответ

0 голосов
/ 01 октября 2018

, когда я освобождаю a, а затем изменяю его адрес, у него все еще будет старое значение, или он получит адрес b

Он получит значение указателя в b,это адрес z.

Код должен освободиться b перед переназначением его на адрес z:

free(b);
b = &z;

В противном случае я не вижу проблемы с кодом, так какпохоже, не разыменовывает любые освобожденные указатели.

output

Это то, что вы ожидаете:

*a=20, *b=20, z=20, w=9
...