Olej писал(а):
- alloca() удобен ещё тем, что, в отличие от malloc(), calloc(), вам не нужно для выделения делать free() - если забудете
, то не создадите утечки памяти.
alloca() ещё позволяет проследить чем отличается блок ({}) внутри кода, и блок как тело функции.
Смотрите:
Код: Выделить всё
#define N 10
void test052( void ) { // размещение локальных данных
void *pX;
int X = 12345;
pX = &X;
printf( "размещение локальных данных:\n" );
{ int X[ N ];
printf( "1-й массив в блоке: %p...%p[%2d]\n",
X, &X[ N - 1 ], (void*)&X[ N - 1 ] - pX );
}
{ int Y[ N ];
printf( "2-й массив в блоке: %p...%p[%2d]\n",
Y, &Y[ N - 1 ], (void*)&Y[ N - 1 ] - pX );
}
printf( "локальная переменная функции: %p->%d\n", &X, X );
}
Код: Выделить всё
olej@notebook:~/2013_WORK/AntonG/examples.draft$ ./function 5
05 ---------------------------------------
размещение локальных данных:
1-й массив в блоке: 0xbfe30280...0xbfe302a4[-4]
2-й массив в блоке: 0xbfe30280...0xbfe302a4[-4]
локальная переменная функции: 0xbfe302a8->12345
------------------------------------------
- размещение локальное в блоке int X[ N ] размещается впритык (-4) к дну стека ... а имя закрывает видимость X функции...
- размещение в следующем блоке (int Y[ N ]) размещается в точности
на том же месте (предыдущее размещение X[] уже
считается освобождённым)
А вот alloca() в блоке:
Код: Выделить всё
#undef N
#define N 6
void test053( void ) { // alloca() данных в блоке
void *p, *X;
int i, Y = 12345;
p = &Y;
printf( "alloca() в блоке:\n" );
for( i = 0; i < N; i ++ ) {
*(short*)( X = alloca( sizeof( short ) ) ) = i + 1;
printf( "%p[%2d]->%d%s",
X, p - (void*)X, *(short*)X,
( N / 2 - 1 ) == i % ( N / 2 ) ? "\n" : " ,\t" );
}
printf( "локальная переменная функции: %p->%d\n", &Y, Y );
}
Тут много интересного...
Код: Выделить всё
olej@notebook:~/2013_WORK/AntonG/examples.draft$ ./function 6
06 ---------------------------------------
alloca() в блоке:
0xbfe30270[48]->1 , 0xbfe30250[80]->2 , 0xbfe30230[112]->3
0xbfe30210[144]->4 , 0xbfe301f0[176]->5 , 0xbfe301d0[208]->6
локальная переменная функции: 0xbfe302a0->12345
------------------------------------------
- последовательные размещения alloca() не освобождаются при выходе из блока (for ... )
- новое размещение делается вглубь стека (новый адрес)
- и освободится всё это, как я понимаю,
при уничтожении кадра стека - при завершении функции!
- ну и ещё одна непонятная вещь ... при последовательных запросах alloca( 2 ) - выделяется по 32 байта и 48 байт при 1-м запросе ... но этого я не понимаю