| 日本-日本語 | 
      
  | 
  
      
  | 
  
| 
 | 
     
OpenVMS マニュアル | 
    
  
  | 
    
     
HP OpenVMS
 | 
    
    
  
| 目次 | 索引 | 
表 8-1 は, HP C Run-Time Library (RTL) のすべてのメモリ割り当て関数を示しています。各関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。
| 関数 | 説明 | 
|---|---|
| brk, sbrk | プログラムで使用されていない最下位仮想アドレスを判断する。 | 
| calloc, malloc | メモリ領域を割り当てる。 | 
| cfree, free | calloc , malloc , realloc 呼び出しによって割り当てられている領域を解放して,再割り当てできるようにする。 | 
| realloc | 最初の引数によって示される領域のサイズを, 2 番目の引数によって指定されるバイト数に変更する。 | 
| strdup | 文字列を複製します。 | 
ヒープから追加記憶域を要求するすべての HP C RTL 関数は, HP C RTL のメモリ割り当て関数 malloc, calloc, realloc, free, cfreeを使用して,その記憶域を取得します。これらの関数によって割り当てられるメモリは,クォドワード境界に揃えられます。
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 のメモリ割り当て関数 calloc, malloc, realloc, freeはそれぞれ,LIB$ ルーチン LIB$VM_CALLOC, LIB$VM_MALLOC,LIB$VM_REALLOC,LIB$VM_FREE をベースにしています。
ルーチン
VAXC$CALLOC_OPT,
VAXC$CFREE_OPT,
VAXC$FREE_OPT,
VAXC$MALLOC_OPT,
VAXC$REALLOC_OPTは破棄されましたので,今後の開発では使用できません。しかし,下位互換性を維持するために,標準的な C メモリ割り当てルーチンと同等として,これらのルーチンのバージョンも提供されています。
![]()
8.1 プログラムの例
![]()
例 8-1 は malloc, calloc, free関数の使用方法を示しています。
| 例 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 $  | 
| 目次 | 索引 | 
      
  | 
  ||||||||