- •Указатели
- •Объявление указателей
- •Доступ к объекту через указатель
- •Инициализация указателей
- •Указатель на неопределенный тип
- •Выражения с указателями
- •Операции с указателями
- •Указатели и массивы
- •Нехватка памяти
- •Указатели и многомерные массивы
- •Использование указателей вместо двумерного массива
- •Свободные массивы и указатели
Нехватка памяти
Как функция malloc(), так и функция calloc() в случае ошибки (например, в куче не хватает объема запрашиваемой памяти) возвращают NULL - указатель, значение которого нельзя использовать в программе. Это обстоятельство можно использовать, чтобы обработать ошибку распределения памяти, например:
float *fp;
fp = (float *) malloc( 4*sizeof (float));
if (fp==NULL)
printf(“Ошибка распределения памяти!”);
Удаление памяти в куче
По окончании работы с выделенным блоком памяти его следует освободить, чтобы функции malloc() или calloc() могли снова воспользоваться этой памятью. Если не освободить выделенную в куче память, которая больше не нужна, ее нельзя будет использовать до конца работы программы. Для освобождения выделенной в куче памяти следует использовать библиотечную функцию free(), которой следует передать указатель на освобождаемую память, например:
free (p);
Пример 1. Программа, в которой запрашивается размерность массива, память под массив распределяется динамически, в процессе исполнения программы. Ввод элементов массива в диалоговом режиме
#include <stdio.h>
#include <conio.h>
#include <alloc.h> // для функции malloc()
int main(void)
{
int n; //переменная, в которую будет введена размерность массива
int i; //управляющая переменная цикла
int *pa; //объявление указателя на данное целого типа
clrscr();
puts ("Введите количество элементов массива");
scanf("%d",&n);
// динамическое распределение памяти под n элементов массива
// инициализация указателя pa адресом, который возвращает функция malloc()
pa=(int *)malloc(n*sizeof(int));
//ввод элементов массива в диалоговом режиме
for(i=0; i<n; i++)
{
printf("\nВведите элемент массива с индексом %d ",i);
scanf("%d",pa+i); //функция scanf получает адрес элем. массива
}
printf("\n\n Массив выведен по 10 элементов в строке \n\n");
//вывод элементов массива
for(i=0; i<n; i++)
{ printf("%6d ", *(pa+i)); // вывод массива
if(i%10==9)
printf("\n");
}
getch();
return 0; }
Пример 2. Обьединение двух строк к концу строки s дописывается строка t, вычисляется длина полученной строки. Память под строки распределяется динамически
#include <alloc.h>
#include <stdio.h>
void main(void)
{ char *t,*s; //объявление указателей на данные типа char
int i=0;
// динамическое распределение памяти под строки
s=(char *)malloc(160);
t=(char *)malloc(80);
puts("Введите первую строку ");
gets(s);
puts("первая строка");
puts(s);
puts("Bведите вторую строку ");
gets(t);
puts("вторая строка");
puts(t);
// выполнять, пока не найден конец первой строки
while(*s!='\0')
{
i++;
s++; //сдвигаем указатель в конец первой строки
}
// выполнять, пока не найден конец второй строки
while(*t!='\0')
{
*s++=*t++; //дописываем символы второй строки к первой
i++;
}
*s='\0'; //дописываем нулевой байт к концу результирующей строки
printf("длина результирующей строки i=%d\n",i);
// сдвигаем указатель в начало результирующей строки
while(--i>=0)
{s--;
}
puts("результат:");
puts(s);
}
