Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Yığında bellek ayırır. Daha güvenli bir sürüm kullanılabilir olduğundan bu işlev kullanım dışıdır; bkz _malloca. .
Sözdizimi
void *_alloca(
size_t size
);
Parametreler
size
Yığından ayrılacak bayt sayısı.
Dönüş değeri
Yordam _alloca , ayrılan alana yönelik bir işaretçi döndürür ve bu, herhangi bir void nesne türünün depolanması için uygun şekilde hizalanır. 0 ise size , _alloca sıfır uzunluklu bir öğe ayırır ve bu öğe için geçerli bir işaretçi döndürür.
Alan ayrılamıyorsa yığın taşması özel durumu oluşturulur. Yığın taşması özel durumu bir C++ özel durumu değildir; Bu yapılandırılmış bir özel durum. C++ özel durum işleme kullanmak yerine Yapılandırılmış özel durum işleme (SEH) kullanmanız gerekir.
Açıklamalar
_alloca program yığınından bayt ayırır size . Ayrılan alan, çağrı işlevi çıktığında (ayırma yalnızca kapsam dışına çıktığında değil) otomatik olarak boşaltılır. Bu nedenle, tarafından _alloca döndürülen işaretçi değerini bağımsız değişken olarak 'a freegeçirmeyin.
Özel durum işleyicisinde (EH) açıkça çağrılmaya _alloca yönelik kısıtlamalar vardır. x86 sınıfı işlemcilerde çalışan EH yordamları kendi bellek çerçevesinde çalışır: Görevleri, kapsayan işlevin yığın işaretçisinin geçerli konumuna bağlı olmayan bellek alanında gerçekleştirir. En yaygın uygulamalar Windows yapılandırılmış özel durum işleme (SEH) ve C++ catch yan tümcesi ifadelerini içerir. Bu nedenle, aşağıdaki senaryolardan herhangi birinde açıkça çağrılması _alloca , ÇAĞRı EH yordamına dönüş sırasında program hatasına neden olur:
Windows SEH özel durum filtresi ifadesi:
__except ( _alloca() )Windows SEH son özel durum işleyicisi:
__finally { _alloca() }C++ EH catch yan tümcesi ifadesi
Ancak, _alloca doğrudan bir EH yordamı içinden veya daha önce listelenen EH senaryolarından biri tarafından çağrılan uygulama tarafından sağlanan bir geri çağırmadan çağrılabilir.
Önemli
Bir deneme bloğu içinde çağrılırsa _alloca , catch bloğunu çağırmanız _resetstkoflw gerekir.
Yukarıdaki kısıtlamalara ek olarak, (Ortak Dil Çalışma Zamanı Derlemesi) seçeneği kullanılırken/clr bloklarda _alloca__except kullanılamaz. Daha fazla bilgi için bkz /clr . Kısıtlamalar.
Gereksinimler
| Yordam | Gerekli başlık |
|---|---|
_alloca |
<malloc.h> |
Örnek
// crt_alloca.c
// This program demonstrates the use of
// _alloca and trapping any exceptions
// that may occur.
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int size = 1000;
int errcode = 0;
void *pData = NULL;
// Note: Do not use try/catch for _alloca,
// use __try/__except, since _alloca throws
// Structured Exceptions, not C++ exceptions.
__try {
// An unbounded _alloca can easily result in a
// stack overflow.
// Checking for a size < 1024 bytes is recommended.
if (size > 0 && size < 1024)
{
pData = _alloca( size );
printf_s( "Allocated %d bytes of stack at 0x%p",
size, pData);
}
else
{
printf_s("Tried to allocate too many bytes.\n");
}
}
// If an exception occurred with the _alloca function
__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
{
printf_s("_alloca failed!\n");
// If the stack overflows, use this function to restore.
errcode = _resetstkoflw();
if (errcode == 0) // _resetstkoflw() returns 0 on failure
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
Allocated 1000 bytes of stack at 0x0012FB50