Aracılığıyla paylaş


_alloca

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

Ayrıca bkz.

Bellek ayırma
calloc
malloc
realloc
_resetstkoflw
_malloca