当前位置: 首页 > 知识库问答 >
问题:

C alloca函数-当试图分配太多内存时会发生什么

权浩邈
2023-03-14

在C语言中,alloca()函数在alloca()调用方的stackframe上分配内存。

当您试图分配大量它无法分配的字节时,会发生什么?

    null

有人有更多关于这方面的信息吗?

共有1个答案

长孙明知
2023-03-14

在windows上,您可以从中恢复。使用GCC测试:

/*
 * Show how get memory from stack without crash
 * Currently, compiles ok with mingw, and the latest version of tiny c (from git)
 * Last Version: 29/june/2014
 * Programmed by Carlos Montiers
 */

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <malloc.h>
#include <setjmp.h>

int _resetstkoflw(void);

static jmp_buf alloca_jmp_buf;

LONG WINAPI AllocaExceptionFilter(EXCEPTION_POINTERS * ExceptionInfo)
{

    switch (ExceptionInfo->ExceptionRecord->ExceptionCode) {
    case STATUS_STACK_OVERFLOW:

    // reset the stack
    if (0 == _resetstkoflw()) {
        printf("Could not reset the stack!\n");
        _exit(1);
    }

    longjmp(alloca_jmp_buf, 1);

    break;
    }

    return EXCEPTION_EXECUTE_HANDLER;
}

int main()
{
    void *m;
    int alloca_jmp_res;
    LPTOP_LEVEL_EXCEPTION_FILTER prev;

    //replace the exception filter function saving the previous
    prev = SetUnhandledExceptionFilter(AllocaExceptionFilter);

    alloca_jmp_res = setjmp(alloca_jmp_buf);
    if ((0 == alloca_jmp_res)) {
    m = alloca(INT_MAX);

    } else if ((1 == alloca_jmp_res)) {
    m = NULL;

    }
    //restore exception filter function
    SetUnhandledExceptionFilter(prev);

    if (!m) {
    printf("alloca Failed\n");
    }

    printf("Bye\n");
    return 1;

}
 类似资料:
  • 问题内容: 就速度和内存效率而言,在函数内部导入Python模块和/或函数有什么优缺点? 它是否在每次运行该功能时重新导入,或者是否仅在运行一开始就重新导入一次? 问题答案: 每次运行该功能时都会重新导入吗? 没有; 确切地说,Python模块在每次导入时都会被缓存,因此导入第二(或第三或第四…)次实际上并不会迫使它们再次经历整个导入过程。1个 是否在开始时导入一次功能是否运行? 不可以,只有在执

  • 4. 分配内存的函数 除了malloc之外,C标准库还提供了另外两个在堆空间分配内存的函数,它们分配的内存同样由free释放。 #include <stdlib.h> void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); 返回值:成功返回所分配内存空间的首地址,出错返回NULL calloc

  • 这三个方法包含相同的参数,所以不应该重载。它们都有执行不同功能的代码。这怎么可能?java如何知道调用哪个方法?在命令行中通过java jar命令执行此代码时,我没有得到任何错误。

  • 我有基于的图像,当这些(我的)图像生成时,被下拉,以便生成我自己的图像。因此,在我的本地计算机中,我有映像。假设基映像得到更新,Microsoft发现该映像中有一个bug,并决定对该标记进行修复,因此它仍然被称为,但实际上它与我构建自己的映像时不同。 所以我有两个问题: 1。每次我的图像被拉下,它会得到我建立图像时的基础图像,对吗?(这似乎很明显,但我需要检查) 2。如果我注意到(网钩,扳机?)有

  • 我对PHP脚本和MySQL的行为很好奇?脚本基本上是两个SQL查询。 第一个从由某个id决定的特定行的列中选择并获取一个数字。 然后,如果数字为正数,则第二个将通过减去某个量来更新列。 很明显,这是一个典型的例子,我会使用事务、锁、互斥体等等。 我的问题是:在一个网站中,两个或更多的用户完全有可能同时调用同一行的脚本。如果不使用事务或锁定表,PHP将如何处理?它们是两个查询/函数调用,但它们在一个