[C] Странности работы с памятью из кучи

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by FK-, 27 Jun 2019.

  1. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    11
    Reputations:
    0
    Доброго времени суток многоуважаемые античатовцы.
    Я далеко не специалист проги на Си и хотел бы знать, может быть кто нибудь знает, что происходит.

    Есть код:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void){
      int *num = malloc(sizeof(int));
      int *test = num;
      *num = 50;
      printf("%p %d\n", num, *num);
      printf("%p %d\n", test, *test);
    
      free(num);
    
      printf("%p %d\n", num, *num);
      printf("%p %d\n", test, *test);
      return 0;
    }
    
    Целью было - проверить, можно ли работать с любой выделенной для программы памятью.
    Несколько дней назад я заканчивал читать K&R, выполнял данный код и получал вывод
    [адрес] 50
    [адрес] 50
    [адрес] 50
    [адрес] 50
    в любом случае, и вывод вполне логичный.

    Позавчера я начал новую книгу (Learn C the hard way). Поставил Valgrind. Ну и решил посмотреть, а законны ли такие действия с памятью, хотя компилятор и не ругается. Нет, не законны, но суть не в этом.

    Я не знаю, почему, но вывод без Валгринда изменился на
    [адрес] 50
    [адрес] 50
    [адрес] 0
    [адрес] 0

    Вот пруф
    https://drive.google.com/open?id=1vyEn3RuKLetOpLW99PvFHTgfIZ5hxixT

    Вывод под Валгриндом - как и раньше, но без него - такой вот странный. Почему это происходит ?
     
    #1 FK-, 27 Jun 2019
    Last edited: 27 Jun 2019
  2. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    533
    Likes Received:
    5,944
    Reputations:
    15
    Valgrind никогда не пробовал но судя по описанию он отлавливает такие баги и твой free либо вообще не работает - либо он перенесен куда-то в конец - либо указатель он таки удаляет но память не затирает каким-то боком - либо у него вообще там свой менеджер памяти с блекджеком и шлюхами и твои вызовы malloc и free он отрабатывает сам.

    Когда ты пишешь free (num) - ты освобождаешь память занятую malloc'ом и больше ей пользоваться не должен ибо в зависимости от расположения планет может быть такое что у тебя кодес работает а у твоего соседа уже нет.
    Не знаю что там делает с этим Valgrind, но лучше-бы писать без него. А его подключать разве что если у тебя большой проект, сдать надо завтра а оно чото "глючит и все портит". Можно тогда его присобачить и посмотреть что будет. Глюки пропали - можно отдать а потом уже имея время спокойно фиксить. Оставлять такие вундервафли не очень хорошо и не безопасно.
    ===================
    UPD: оу. Да он еще и под Линух. Тогда от погоды может зависеть очень многое. Причина: так пейсать нельзя и нет ничего логичного в первом случае. Память ты освободил а потом из нее читаешь. Это как если тебе продадут дом, но будут постоянно заходить в гости, будут делать там что хотят и бухтеть если ты им мешаешь :)
     
    #2 DartPhoenix, 27 Jun 2019
    Last edited: 27 Jun 2019
    daemon_mors and FK- like this.
  3. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    11
    Reputations:
    0
    Я тебя понял. Спасибо :D
     
Loading...