Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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