日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:入出力について
第 3 章:文字/文字列/引数リスト関数
第 4 章:エラー処理とシグナル処理
第 5 章:サブプロセス関数
第 6 章:Curses画面管理関数とマクロ
第 7 章:算術関数
第 8 章:メモリ割り当て関数
第 9 章:システム関数
第 10 章:国際化ソフトウェアの開発
第 11 章:日付/時刻関数
第 12 章:シンボリックリンクとPOSIXパス名
付録 A:各OSバージョンでサポートする関数一覧
付録 B:非標準ヘッダに複製されているプロトタイプ
索引
PDF
OpenVMS ホーム

HP OpenVMS
HP C ランタイム・ライブラリ・リファレンス・マニュアル (上巻)


目次 索引

第 8 章
メモリ割り当て関数

表 8-1 は, HP C Run-Time Library (RTL) のすべてのメモリ割り当て関数を示しています。各関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。

表 8-1 メモリ割り当て関数
関数 説明
brk, sbrk プログラムで使用されていない最下位仮想アドレスを判断する。
calloc, malloc メモリ領域を割り当てる。
cfree, free calloc malloc realloc 呼び出しによって割り当てられている領域を解放して,再割り当てできるようにする。
realloc 最初の引数によって示される領域のサイズを, 2 番目の引数によって指定されるバイト数に変更する。
strdup 文字列を複製します。

ヒープから追加記憶域を要求するすべての HP C RTL 関数は, HP C RTL のメモリ割り当て関数 malloccallocreallocfreecfreeを使用して,その記憶域を取得します。これらの関数によって割り当てられるメモリは,クォドワード境界に揃えられます。

ANSI C 標準には, cfreeは含まれていません。この理由から,メモリの割り当てを解除するには,同じ機能を実行する free関数を使用するようにしてください。

brk関数と sbrk関数では,メモリはアドレス空間の一番上から連続的に割り当てることができるものと仮定されています。しかし, malloc関数と RMS は,これと同じアドレス空間から領域を割り当てる可能性があります。 mallocを使用する HP C RTL ルーチンや RMS と組み合わせて, brk関数および sbrk関数を使用しないでください。

VAX C RTL に関するドキュメントの以前のバージョンには,メモリ割り当てルーチンは OpenVMS RTL の関数 LIB$GET_VM を使用して動的メモリを取得し, LIB$FREE_VM を使用して動的メモリを返すと示されていました。しかし,現在はこのようになっていません。これらのルーチンと HP C RTL メモリ割り当てルーチンの間の相互関係の問題はなくなりました ( ただし,LIB$SHOW_VM を使用して, HP C RTL の mallocおよび freeの使用状況を追跡することはできなくなりました )。

HP C RTL のメモリ割り当て関数 callocmallocreallocfreeはそれぞれ,LIB$ ルーチン LIB$VM_CALLOC, LIB$VM_MALLOC,LIB$VM_REALLOC,LIB$VM_FREE をベースにしています。

ルーチン VAXC$CALLOC_OPTVAXC$CFREE_OPTVAXC$FREE_OPTVAXC$MALLOC_OPT
VAXC$REALLOC_OPTは破棄されましたので,今後の開発では使用できません。しかし,下位互換性を維持するために,標準的な C メモリ割り当てルーチンと同等として,これらのルーチンのバージョンも提供されています。

8.1 プログラムの例

例 8-1malloccallocfree関数の使用方法を示しています。

例 8-1 構造体に対するメモリの割り当てと割り当ての解除
/*        CHAP_8_MEM_MANAGEMENT.C                               */ 
 
/* This example takes lines of input from the terminal until    */ 
/* it encounters a Ctrl/Z, places the strings into an           */ 
/* allocated buffer, copies the strings to memory allocated for */ 
/* structures, prints the lines back to the screen, and then    */ 
/* deallocates all the memory used for the structures.          */ 
 
#include  <stdlib.h> 
#include  <stdio.h> 
#define   MAX_LINE_LENGTH  80 
 
struct line_rec {               /*  Declare the structure.   */ 
    struct line_rec *next;      /*  Pointer to next line.    */ 
    char *data;                 /*  A line from terminal.    */ 
}; 
 
int main(void) 
{ 
    char *buffer; 
 
    /* Define pointers to        */ 
    /*  structure (input lines). */ 
 
    struct line_rec *first_line = NULL, 
            *next_line, 
            *last_line = NULL; 
 
    /* Buffer points to memory.  */ 
    buffer = malloc(MAX_LINE_LENGTH); 
 
    if (buffer == NULL) {       /* If error ...  */ 
        perror("malloc"); 
        exit(EXIT_FAILURE); 
    } 
 
    while (gets(buffer) != NULL) {      /* While not Ctrl/Z ...  */ 
        /* Allocate for input line.  */ 
        next_line = calloc(1, sizeof (struct line_rec)); 
 
        if (next_line == NULL) { 
            perror("calloc"); 
            exit(EXIT_FAILURE); 
        } 
 
        /* Put line in data area.    */ 
        next_line->data = buffer; 
 
        if (last_line == NULL)  /* Reset pointers.   */ 
            first_line = next_line; 
        else 
            last_line->next = next_line; 
 
        last_line = next_line; 
        /* Allocate space for the     */ 
        /*  next input line.          */ 
        buffer = malloc(MAX_LINE_LENGTH); 
 
        if (buffer == NULL) { 
            perror("malloc"); 
            exit(EXIT_FAILURE); 
        } 
    } 
    free(buffer);       /* Last buffer always unused. */ 
    next_line = first_line;     /* Pointer to beginning.  */ 
 
    while (next_line != NULL) { 
        puts(next_line->data);  /* Write line to screen.  */ 
        free(next_line->data);  /* Deallocate a line.     */ 
        last_line = next_line; 
        next_line = next_line->next; 
        free(last_line); 
    } 
 
    exit(EXIT_SUCCESS); 
} 

次の例は, 例 8-1 の入力と出力を示しています。

$ RUN  EXAMPLE
line one
line two
[Ctrl/Z]
EXIT
line one
line two
$ 


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.