当_malloca无法在堆上分配内存时

时间:2014-07-11 15:28:18

标签: c stack-overflow alloca

当alloca无法在堆上分配内存时,它会使用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。你可以说,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();
}

但它继续有效。如果使用数组的所有元素然后再次获得访问冲突。
问题:这是错误还是功能?

1 个答案:

答案 0 :(得分:2)

Yey!我是对的,当无法在堆上使用malloc分配内存时_malloca返回NULL。问题是在电话中,这是愚蠢的((

foo(900000000000);

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

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

当我打电话

foo(INT_MAX);

它返回NULL,因为无法分配内存。