Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
933.3 Кб
Скачать

15.5. Типичные ошибки, связанные с указателями Отсутствие инициализации указателя

Пример.

int *x;

.......

*x = 16; // x не задано значение

Двойное указание

int* x = new int,

* y = new int,

* z = new int;

*x = 14; *y = 15; *z = 16;

printf("(%d, %d, %d)\n", *x, *y, *z);

/* На экране имеем: (14, 15, 16) */

*z = *x;

printf("(%d, %d, %d)\n", *x, *y, *z);

/* На экране: (14, 15, 14) */

y = x; // !!! Память, отведенная при объявлении y, становится недоступной

printf("(%d, %d, %d)\n", *x, *y, *z);

/* На экране: (14, 14, 14) */

*x = -14; *y = -15; *z = -16;

printf("(%d, %d, %d)\n", *x, *y, *z);

/* На экране: (-15, -15, -16) */

Замечание. Память, отведенная при инициализации указателю y, становится недоступной ("подвисшей").

Hе выполнено освобождение выделенной памяти

Забыли выполнить оператор delete (См. использование функции substr).

Задание адреса локальной (auto) переменной

См. пример для функции substr, использование локального массива для строки. После выхода из функции память, отведенная под массив, была бы освобождена и указатель p стал бы ссылаться на "мусор".

Не следует использовать явное задание адреса (pt=(double*)0777000)

При переходе на другую операционную систему программа даст ошибку. Этот критерий качества программы называют немобильностью.

15.6. Примеры использования указателей. Структуры данных

15.6.1. Стек

Стек – это совокупность данных, в которой доступен только последний помещенный в нее элемент – вершина стека. Если удалить элемент из вершины, становится доступным предыдущий и т.д.

Состояние

Операция

Содержимое

1

Нет

(пусто)

2

Поместить в стек

элемент 1

3

Поместить в стек

элемент 2

элемент1

4

Извлечь из стека

элемент 1

5

Извлечь из стека

(пусто)

Пример. Работа со стеком.

typedef <описание_хранимых_данных> TypeEl

// Описание делает фрагмент независи-

// мым от типа обрабатываемых данных

struct Stack{ // Элемент стека – рекурсивная структура

TypeEl zap; // Хранимые данные

struct Stack *p; // Ссылка на предыдущий элемент

}; // Это были описания, вводящие 2 новых типа

/* Определения */

typeEl sod; // Содержание хранимых данных элемента

Stack *TekPtr = NULL, // Текущий элемент – пока никуда не указывает

*PrPtr = NULL; // Предыдущий элемент – также не задан

........................................

// Поместить в стек

TekPtr = new Stack; // Выделяем память под элемент стека

TekPtr -> zap = sod; // Задаем значения элемента

TekPtr -> p = PrPtr; // 1 элемент стека не имеет предыдущего

PrPtr = TekPtr; // Запоминаем адрес элемента стека

........................................

// Извлечь из стека

if(TekPtr == NULL){ // Стек пуст

// Попытка извлечь из "пустого" стека

/* Обработка ошибки */ // Ошибка! Обрабатываем

}else{ //Извлекаем данные. Запоминаем адрес предыдущего

// Освобождаем память

sod = TekPtr->zap; PrPtr = TekPtr -> p; delete TekPtr; TekPtr = PrPtr;

} // В вершине стека предыдущий элемент

Пример. Дан массив {ai}, i=1...n. Перестроить его в следующем порядке: сначала все ai<0 в порядке следования, затем все ai>=0 в обратном порядке.

typedef float type_el; // Настройка типа

struct Stack{ // Определение типа Stack

type_el zap; // Хранимые данные

struct Stack* p; // Ссылка на предыдущий элемент

};

void perest(short n, type_el* a){

// Параметр - указатель a; аргумент - массив

int i,k;

Stack* tek_ptr, // Указатель на текущий элемент стека

*pr_ptr=NULL;// Указатель на предыдущий элемент. Пока его нет

for(k=i=0; i<n; i++){// 1-й проход по массиву

if(a[ i ]<0){ // Заполнение a[ i ]<0

a[k++]=a[ i ];

}else{ // a[ i ]>=0 помещаются в стек

tek_ptr=new Stack; // Выделение памяти

// Заполнение

tek_ptr->zap=a[ i ]; tek_ptr->p=pr_ptr; pr_ptr=tek_ptr;

}

}

// 2 проход. Извлечение из стека и помещение в массив a

for(i=k; i<n; i++){

a[ i ]=tek_ptr->zap; pr_ptr=tek_ptr->p; delete tek_ptr; tek_ptr=pr_ptr;

}

}/* End perest */

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]