Bagikan melalui


_alloca

Mengalokasikan memori pada tumpukan. Fungsi ini tidak digunakan lagi karena versi yang lebih aman tersedia; lihat _malloca.

Sintaks

void *_alloca(
   size_t size
);

Parameter

size
Byte yang akan dialokasikan dari tumpukan.

Nilai hasil

Rutinitas _alloca mengembalikan penunjuk ke ruang yang dialokasikan, yang cocok diselaraskan void untuk penyimpanan jenis objek apa pun. Jika size adalah 0, _alloca alokasikan item panjang nol dan mengembalikan penunjuk yang valid ke item tersebut.

Pengecualian luapan tumpukan dihasilkan jika ruang tidak dapat dialokasikan. Pengecualian luapan tumpukan bukan pengecualian C++; ini adalah pengecualian terstruktur. Alih-alih menggunakan penanganan pengecualian C++, Anda harus menggunakan Penanganan pengecualian terstruktur (SEH).

Keterangan

_alloca mengalokasikan size byte dari tumpukan program. Ruang yang dialokasikan secara otomatis dibesarkan ketika fungsi panggilan keluar (bukan ketika alokasi hanya pingsan dari cakupan). Oleh karena itu, jangan meneruskan nilai penunjuk yang dikembalikan oleh _alloca sebagai argumen ke free.

Ada batasan untuk secara eksplisit memanggil _alloca dalam handler pengecualian (EH). Rutinitas EH yang berjalan pada prosesor kelas x86 beroperasi dalam bingkai memori mereka sendiri: Mereka melakukan tugas mereka di ruang memori yang tidak didasarkan pada lokasi pointer tumpukan fungsi penutup saat ini. Implementasi yang paling umum termasuk penanganan pengecualian terstruktur Windows (SEH) dan ekspresi klausa tangkapan C++. Oleh karena itu, secara eksplisit memanggil _alloca dalam salah satu skenario berikut mengakibatkan kegagalan program selama kembali ke rutinitas EH panggilan:

  • Ekspresi filter pengecualian Windows SEH: __except ( _alloca() )

  • Handler pengecualian akhir Windows SEH: __finally { _alloca() }

  • Ekspresi klausa tangkapan C++ EH

Namun, _alloca dapat dipanggil langsung dari dalam rutinitas EH atau dari panggilan balik yang disediakan aplikasi yang dipanggil oleh salah satu skenario EH yang sebelumnya tercantum.

Penting

Jika _alloca dipanggil di dalam blok percobaan, Anda harus memanggil _resetstkoflw di blok tangkapan.

Selain pembatasan di atas, saat menggunakan/clr opsi (Kompilasi Runtime Bahasa Umum),_alloca tidak dapat digunakan dalam __except blok. Untuk informasi selengkapnya, lihat /clr Pembatasan.

Persyaratan

Rutin Header yang diperlukan
_alloca <malloc.h>

Contoh

// 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

Baca juga

Alokasi memori
calloc
malloc
realloc
_resetstkoflw
_malloca