スタックエリアの使い方。
動的メモリの利用の基礎として、スタックエリアの使い方。
char bigarea[ xxxxx ] ; char *tail = bigarea ; char *table[ 100 ] ; int size = 0 ; char buff[ 1024 ] ; while( scanf( "%s" , buff ) == 1 ) { table[ size ] = tail ; strcpy( tail , buff ) ; tail += strlen( buff ) + 1 ; size++ ; }
のコードにて、使用領域と未使用領域の境界を1つの変数で管理する方式の 説明。この方式は、CASL でのスタック等の考え方と同じである点の説明。
int stack[ 100 ] ; int sp = 0 ; void push( int x ) { stack[ sp++ ] = x ; } int pop() { return stack[ --sp ] ; } }
にて、Last In First Out の概念を説明。これに伴い、alloca() の使い方も 例を示す。
ヒープメモリの使い方
LIFO が、最後に確保した物から、最初に不要になる場合は OK だけど、 そういう場合で無い時の問題点を指摘して、動的メモリとして、 スタックとヒープがある点を説明してから、malloc の説明。
malloc() に、必要メモリサイズを渡すと、確保されたメモリの先頭が 帰ってくること、free() は、不要となったことをしらせ、その領域が 次の malloc() で再利用されることを説明。
while( scanf( "%s" , buff ) == 1 ) { table[ size ] = (char*)malloc( strlen( buff ) + 1 ) ; strcpy( table[ size ] , buff ) ; // NULL チェックはこの後に説明した size++ ; } : for( i = 0 ; i < size ; i++ ) free( table[ i ] ) ;