C - _malloca不能在堆上分配内存



当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 WinDesktop。好的,你可能会说,试着捕捉异常

#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();
}

,但它继续工作。如果使用了数组的所有元素,又会导致访问冲突。
问题:这是bug还是特性?

哇!我是对的,_malloca返回NULL时,不能在堆上使用malloc分配内存。问题在电话里,那是愚蠢的()

foo(900000000000);

无效,因为它大于我计算机上的size_t大小。Malloc.h使用此函数检查大小是否正常

__inline int _MallocaIsSizeInRange(size_t size)
{
    return size + _ALLOCA_S_MARKER_SIZE > size;
}

当我调用

foo(INT_MAX);

返回NULL,因为内存不能分配。

相关内容

  • 没有找到相关文章

最新更新