Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Недопонимание с памятью

#c #указатели #память


Я создаю функцию, единственным аргументом которой будет указатель на int **. В теле
функции я создаю автоматическую переменную и инициализирую ее неким значением. Затем
своему указателю присваиваю адрес данной переменной. Код выглядит примерно так:

void function(int ** p){

    int count = 5;
    *p = &count;

}


В main() я создаю указатель на int * и для него вызываю данную функцию, тобишь:

int main(){

    int * p = NULL;
    function(&p);

    printf("MAIN = %d\n\n", *p); /* выводит 5 */

   return 0;
}


И у меня возникает вопрос - почему не уничтожаются данные в памяти переменной count
после того, как поток выходит из функции? Неужели данные в памяти у любого класса хранения
живут на протяжении выполнения всей программы? 
    


Ответы

Ответ 1



Потому что в си программист сам следит за памятью. Автоматически ничего не инициализируется и ничего не затирается. Неинициализированная или неправильно инициализированная переменная содержит мусор. Любой мусор. Помимо этого, если программист не уследил за указателями или инициализацией, возникает так называемое неопределённое поведение, при котором программа может вести себя непредсказуемым образом.

Комментариев нет:

Отправить комментарий