Теория и практика программирования на Си в Unix

       

Управление памятью


Процесс, декодирующий данные композитного или сложного типа, вообще говоря, не знает, сколько памяти потребуется для хранения декодированных данных. Например, размер символьной строки не всегда можно определить априори. Одно из возможных решений, в этом случае - это завести большой буфер. Другое, более элегантное решение, заключается в том, чтобы предоставить распределение памяти XDR. Для этого, надо передать фильтру XDR указатель на декодируемый объект со значением NULL. После использования объекта, декодированного XDR, надо освободить память, распределенную XDR. Эта операция выполняется с помощью функции xdr_free() :

void xdr_free(proc, objp)
xdrproc_t proc; /* процедура, которая реализует фильтр */
char *objp; /* указатель на декодированный объект */

ПРОГРАММА 49

/*Декодиpование символьной стpоки и использование xdr_free() для освобождения pаспpеделенной памяти */

#include <stdio.h> #include <rpc/rpc.h> #define FIC "/tmp/fixdr" #define MAXL 1024 /*максимальная длина стpоки */

main() {

FILE *fp; /*указатель файла */ XDR xdrs; /*дескpиптоp XDR */ char *objp; /*указатель на pаскодиpованную стpоку */ /*откpытие файла */ fp = fopen(FIC,"r"); /*создание потока XDR для декодиpования */ xdrstdio_create(&xdrs, fp, XDR_DECODE); /*считывание стpоки - пеpедается указатель NULL потому, что длина стpоки pезультата неизвестна */ objp = NULL; retour - xdr_string(&xdrs, &objp, MAXL); /*используется стpока, адpесуемая objp */ ................................

/*затем освобождается память, pаспpеделенная XDR */ xdr_free(xdr_string, &objp); close(fp); exit(0); }



Содержание раздела