当 alloca 无法在堆上分配内存时,它会创建结构化异常 stackoverflow 并使用 Stackoverflow 停止程序。好的。但是当 _malloca 不能在堆上分配内存时,它什么也没说。我分配了大量内存,然后使用它,但得到访问冲突异常。例子
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
void foo(size_t n) {
int *arr = (int*) _malloca(n*sizeof(int));
size_t i;
for (i = 0; i < n; i++) {
arr[i] = rand();
}
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
但是当我只使用部分分配的内存时,我根本没有例外。例子
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
void foo(size_t n) {
int *arr = (int*) _malloca(n*sizeof(int));
size_t i;
for (i = 0; i < 100; i++) {
arr[i] = rand();
}
for (i = 0; i < 100; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
VSE2013 桌面版。Oki,你可能会说,试着捕捉异常
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <windows.h>
void foo(size_t n) {
int *arr = NULL;
size_t i;
__try {
arr = (int*)_malloca(n*sizeof(int));
} __except (GetExceptionCode() == STATUS_STACK_OVERFLOW) {
int errcode;
printf("_malloca failed!\n");
_getch();
errcode = _resetstkoflw();
if (errcode) {
printf("Could not reset the stack!");
_getch();
_exit(1);
}
}
for (i = 0; i < 100; i++) {
arr[i] = rand();
}
for (i = 0; i < 100; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
但它继续工作。如果使用数组的所有元素,则再次获得访问冲突。
问题:这是错误还是功能?