Проблемы, связанные с указателями

Самые распространенные проблемами при использовании указателей:

1) попытка работать с указате­лем, не содержащим адреса ОП, выделенной под переменную;

2) потеря значения указателя из-за присваивания ему нового
значения до освобождения ОП, которую он адресует;

3) неосвобождение ОП, запрошенной с помощью функции выделения динамической памяти.

При объявлении указателя на значение любого типа ОП для ад­ресуемого значения не резервируется. Выделяется только ОП для переменной-указателя, но указатель при этом не получает никакого значения. Рассмотрим пример, содержащий грубую ошибку – попытку работать с не­инициализированным указателем:

int *х; //указателю х выделена ОП, но х не содержит адреса ОП для

//конкретной переменной

*x=123; //ошибка

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

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

Исправить ситуацию можно с помощью одной из функций выделения динамической памяти, например функции malloc(). Форма обращения к функции malloc():

<имя_указателя> = (<тип_указателя>)malloc(<объем_ОП>);

где <имя_указателя> – имя переменной-указателя; <тип_указателя> – тип значения, возвращаемого функцией malloc(); <объем_ОП> – количество байтов ОП, выделяемой адресуемой переменной.

Например,

х=(int*)malloc(sizeof(int));

При этом из кучи выделяется 4 байта ОП для целого значения, а адрес его размещения заносится в указатель х. При таком выделении памяти работоспособность программы не нарушается. Аргумент функции malloc() определяет объем ОП для целого значения с помощью операции определения объема ОП для размещения значения целого типа sizeof(int). Операция (int*), записанная перед функцией, означает, что адрес, возвращаемый функцией malloc(), рассматривается как указатель на переменную целого типа. Это операция приведения типов.

Таким образом, ошибки не будет при использовании операторов:

int *х; //x – имя указателя

x=(int*)malloc(sizeof(int));

//выделена ОП целому значению, на которое указывает х, и переменой х

//присваивается адрес выделенной ОП

*x=123; // переменная, на которую указывает х, получила значение

// 123

Освобождение ОП в куче выполняет функция free(). Ее аргументом является имя указателя, содержащего адрес освобождаемой и ранее выделенной динамической памяти, например free(x);








Дата добавления: 2015-08-08; просмотров: 691;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.003 сек.