C言語のいくつかの常用メモリ分配関数
6759 ワード
まず質問プログラムを見てみましょう(ここではTCコンパイラを使用しています):
出力の結果は:8 fc|1 8 fe|2このプログラムのコンパイルは通過して、正常に運行して、それが問題があると言って、問題はどこにありますか?
まずmallocにより,iが指すアドレスは8 fc,i+1が指すアドレスは8 fc+sizeof(int)=8 feであるが,アドレス8 feは保護されていない.機械がi+1に割り当てたものではないため,いつでも他の変数に占有される.
正しいやり方は
reallocは、拡張または縮小にかかわらず、既存のメモリのコンテンツを一定に保つために、所与のポインタが指す空間を拡大または縮小することができる.
もちろん、縮小については、縮小された部分の内容が失われます.
reallocは、調整後のメモリ領域と元のメモリ領域が同じメモリアドレスを保持することを保証しません.しかし、できるだけ元の基礎の上で拡張します.元のスペースが収容できない場合は、新しいメモリに拡張され、元のデータを移行しますが、topポインタの変更を覚えておいてください.
逆にreallocが返すポインタは、新しいアドレスを指す可能性が高い.したがって、コードでは、reallocが返す値をp:
さらに、空のポインタ(0)をreallocに渡すことができます.reallocの役割はmallocに完全に相当します.
この行は、
『備考:TCコンパイラではsizeof(int)=2、VCではsizeof(int)=4、char型は2つのコンパイラで同じで、いずれも1バイト(8ビット)』
callocはmallocと似ており、パラメータnelemは申請アドレスの単位要素長であり、elsizeは要素個数であり、例えばchar*p;
reallocは、所与のポインタが指す空間を拡大または縮小することができ、拡張または縮小にかかわらず、既存のメモリのコンテンツは変わらない(freeが落ちる).
もちろん、縮小については、縮小された部分の内容が失われます.
reallocは、調整後のメモリ領域と元のメモリ領域が同じメモリアドレスを保持することを保証しません.逆にreallocが返すポインタは、新しいアドレスを指す可能性が高い.したがって、コードでは、reallocが返す値をp:
個人的にまとめるとrealloc関数は2つです.
変換元: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は初期化しません.中のデータはランダムなゴミデータです.使い方:
プログラム例2この例からcallocが記憶空間を割り当てた後に要素を初期化することが分かる.
0を10個出力します.
#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個出力します.