C言語動的配列の原理と実現


最近いくつかのプログラムを作成し,多くは配列を用いている.しかし、配列の大きさは固定されていません.つまり、配列の大きさを変更することができ、その大きさは変化することができます.初心者のように、要求を満たすために最大値を取らなければならない範囲を教えてあげます.それは不要なメモリユニットを無駄にする可能性があります!では、動的配列列をどのように定義すればいいのでしょうか.         
配列の章では,配列の長さが予め定義されており,プログラム全体で固定されていることを紹介した.C言語では動的配列タイプは許可されていません.例えば、int n;scanf("%d",&n);int a[n]; 長さを変数で表し、配列の大きさを動的に説明したいのは間違いです.しかし、実際のプログラミングでは、必要なメモリ領域が実際に入力されたデータに依存し、予め特定できない場合が多い.
このような問題に対して,配列の方法では解決しにくい.上記の問題を解決するために、C言語はいくつかのメモリ管理関数を提供して、これらのメモリ管理関数は必要に応じて動的にメモリ空間を割り当てることができて、もう使わない空間を回収して待機することができて、メモリ資源を有効に利用するために手段を提供しました.他の文献で述べる「動的配列」とは、メモリの申請と解放関数を利用して、プログラムの実行中に実際の必要に応じて配列の大きさを指定することを指す.その本質は配列を指すポインタ変数である.一般的なメモリ管理関数は、次の3つです.
1.メモリ空間関数を割り当てるmalloc呼び出し形式:(タイプ説明子*)malloc(size)機能:メモリのダイナミックストレージ領域にsizeバイトの長さの連続領域を割り当てる.関数の戻り値は、その領域の先頭アドレスです.「タイプ・ディスクリプタ」は、領域を使用するデータ型を表します.(タイプ説明子*)は、戻り値を強制的にタイプポインタに変換することを示します.「size」は符号なしの数です.例えば、pc=(char*)malloc(100);100バイト割り当てられたメモリ領域を表し、強制的に文字配列タイプに変換され、関数の戻り値はその文字配列を指すポインタであり、このポインタをポインタ変数pcに与える.    
2.メモリ領域の割り当て関数calloc callocは、メモリ領域の割り当てにも使用されます.呼び出し形式:(タイプ説明子*)calloc(n,size)機能:メモリダイナミックストレージ領域にnブロック長がsizeバイトの連続領域を割り当てる.関数の戻り値は、その領域の先頭アドレスです.(タイプ説明子*)タイプ変換を強制します.calloc関数とmalloc関数の違いは,nブロック領域を一度に割り当てることができることにある.例えば、ps=(struet stu*)calloc(2,sizeof(struct stu);ここでsizeof(struct stu)はstuの構造長を求める.したがって,この文の意味は,stuの長さで2つの連続領域を割り当て,stuタイプに強制的に変換し,そのヘッダアドレスにポインタ変数psを付与することである.
3.メモリ空間関数を解放free呼び出し形式:free(void*ptr);機能:ptrが指すメモリ空間を解放します.ptrは任意のタイプのポインタ変数で、解放された領域のヘッダアドレスを指します.解放される領域はmallocまたはcalloc関数によって割り当てられる領域であるべきである.
/*Problem B:      ,    m m  (1
//    
	array = (int *)malloc(sizeof(int)*m*m);
	result = (int *)malloc(sizeof(int)*m+2);
	if(array == 0)
	{
		printf("quit!------");
		exit(0);
	}
//      
	for(i = 0;i
        free(array);
        free(result);
}