C言語のいくつかの常用メモリ分配関数

6759 ワード

まず質問プログラムを見てみましょう(ここではTCコンパイラを使用しています):
 #include "stdlib.h"
 #include "stdio.h"
void main()
{
   int *i;
   i=(int *)malloc(sizeof(int));
   *i=1;
   *(i+1)=2;
   printf("%x|%d
"
,i,*i); printf("%x|%d",i+1,*(i+1)); }

出力の結果は:8 fc|1 8 fe|2このプログラムのコンパイルは通過して、正常に運行して、それが問題があると言って、問題はどこにありますか?
まずmallocにより,iが指すアドレスは8 fc,i+1が指すアドレスは8 fc+sizeof(int)=8 feであるが,アドレス8 feは保護されていない.機械がi+1に割り当てたものではないため,いつでも他の変数に占有される.
正しいやり方は
 #include "stdlib.h"
 #include "stdio.h"
void main()
{
   int *i;
   i=(int *)malloc(sizeof(int));
   *i=1;
   i=(int *)realloc(i,2*sizeof(int));//     realloc  ,      
   *(i+1)=2;
   printf("%x|%d
"
,i,*i); printf("%x|%d",i+1,*(i+1)); }

reallocは、拡張または縮小にかかわらず、既存のメモリのコンテンツを一定に保つために、所与のポインタが指す空間を拡大または縮小することができる.
もちろん、縮小については、縮小された部分の内容が失われます.
reallocは、調整後のメモリ領域と元のメモリ領域が同じメモリアドレスを保持することを保証しません.しかし、できるだけ元の基礎の上で拡張します.元のスペースが収容できない場合は、新しいメモリに拡張され、元のデータを移行しますが、topポインタの変更を覚えておいてください.
逆にreallocが返すポインタは、新しいアドレスを指す可能性が高い.したがって、コードでは、reallocが返す値をp:p = (int *) realloc (p, sizeof(int) *15);に再割り当てする必要があります.
さらに、空のポインタ(0)をreallocに渡すことができます.reallocの役割はmallocに完全に相当します.int* p = (int *) realloc (0,sizeof(int) * 10);//新しいメモリ容量を割り当てます.
この行は、int* p = (int *) malloc(sizeof(int) * 10);と完全に同等です.
『備考:TCコンパイラではsizeof(int)=2、VCではsizeof(int)=4、char型は2つのコンパイラで同じで、いずれも1バイト(8ビット)』
callocはmallocと似ており、パラメータnelemは申請アドレスの単位要素長であり、elsizeは要素個数であり、例えばchar*p;p=(char*)calloc(sizeof(char),20);この例は前の効果と同じです
reallocは、所与のポインタが指す空間を拡大または縮小することができ、拡張または縮小にかかわらず、既存のメモリのコンテンツは変わらない(freeが落ちる).
もちろん、縮小については、縮小された部分の内容が失われます.
reallocは、調整後のメモリ領域と元のメモリ領域が同じメモリアドレスを保持することを保証しません.逆にreallocが返すポインタは、新しいアドレスを指す可能性が高い.したがって、コードでは、reallocが返す値をp:p = (int *) realloc (p, sizeof(int) *15);に再割り当てする必要があります.
個人的にまとめるとrealloc関数は2つです.
realloc                             。               。                                 ,     top     。
             (free ),         free 

変換元:https://www.cnblogs.com/manfredHu/p/4343229.html
calloc
callocはISO C関数名:calloc関数プロトタイプ:void*calloc(size_t n,size_t size);機能:メモリのダイナミックストレージ領域にsizeの長さの連続空間をn個割り当て、関数は割り当て開始アドレスを指すポインタを返す.割り当てが失敗した場合はNULLを返します.n:Number of elementsメンバー数size:Length in bytes of each element各メンバーバイト長
関数の概要とmallocの違い:callocはメモリを動的に割り当てた後、自動的にこのメモリ空間を初期化してゼロになりますが、mallocは初期化しません.中のデータはランダムなゴミデータです.使い方:void *calloc(size_t n, size_t size);一般的に使用後free(ホームアドレスのポインタ)を使用してメモリを解放します.そうしないと、メモリの申請が多すぎるとコンピュータの性能に影響し、コンピュータを再起動しなければなりません.使用後にゼロがクリアされない場合は、ポインタを使用してブロックメモリにアクセスすることもできます.ヘッダファイル:stdlib.h又はmalloc.h相関関数:malloc、realloc、free_allocaアプリケーション例編集プログラム例1
 #include
 #include
 #include

int main()
{
    char*str = NULL;

    /*      */
    str = (char*)calloc(10,sizeof(char));

    /* hello  */
    strcpy(str, "Hello");

    /*      */
    printf("String is %s
"
,str); /* */ free(str); return 0; }

プログラム例2この例からcallocが記憶空間を割り当てた後に要素を初期化することが分かる.
#include
#include
int main()
{
    int i;
    int* pn = (int*)calloc(10, sizeof(int));
    for(i = 0;i < 10;i++)
        printf("%d", pn[i]);
    printf("
"
); free(pn); return 0; }

0を10個出力します.