首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用alloca函数崩溃,但使用malloc则可以

使用alloca函数崩溃,但使用malloc则可以
EN

Stack Overflow用户
提问于 2014-03-27 16:15:34
回答 3查看 647关注 0票数 3

请解释一下坠毁的原因。我有第三方代码,它意外地与EXC_BAD_ACCESS崩溃

代码语言:javascript
复制
static int overwrite_selector(struct srm_target *srm, MARFileRemoverProgressBlock progressBlock)
{
    srm->buffer = (unsigned char *)alloca(srm->buffer_size);

    if(overwrite_byte(srm, 1, 0xF6, progressBlock) < 0) return -1;
    return 0;
}

static int overwrite_byte(struct srm_target *srm, const int pass, const int byte, MARFileRemoverProgressBlock progressBlock)
{
  memset(srm->buffer, byte, srm->buffer_size);
  return overwrite(srm, pass, progressBlock);
}

崩溃发生在line (srm->缓冲区、字节、srm->buffer _size)上;因此,为srm->缓冲区分配内存似乎有问题。但是如果我把alloca替换为malloc,那么一切都没问题(没有崩溃)。

我在OSX10.9ARC上开发

我注意到了特定于Apple的比特:如果我在全局队列中运行代码,则会发生崩溃,但如果在主队列上运行,则一切正常。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-27 16:19:16

听起来像是堆栈溢出,alloca将从堆栈中分配。,所以如果您试图分配太多,这将导致堆栈溢出,而malloc将从堆中分配,而堆要大得多。不可能知道当您用alloca溢出堆栈时

另外,请注意,由于alloca在堆栈上分配,返回函数的内存将无法工作,因为一旦退出函数,该内存将不再可用。因此,如果需要使用函数外部的内存,则需要使用malloc

票数 3
EN

Stack Overflow用户

发布于 2014-03-27 16:26:39

在这里,您按功能分配内存,

代码语言:javascript
复制
static int overwrite_selector(struct srm_target *srm, MARFileRemoverProgressBlock progressBlock)
{
    srm->buffer = (unsigned char *)alloca(srm->buffer_size);

    if(overwrite_byte(srm, 1, 0xF6, progressBlock) < 0) return -1;
    return 0;
}

由于您使用alloca,当函数返回时,分配的内存将被释放。因为当您从其他函数中使用它时,它会导致程序崩溃。

在这里,您调用了分配内存的函数中的其他函数。所以原因似乎是堆积如山。从alloca中无法知道这种情况。由于alloca在堆栈溢出上的这种未定义行为,在这种情况下使用alloca是不好的。

票数 3
EN

Stack Overflow用户

发布于 2014-03-27 17:21:07

由于alloca试图在堆栈上分配字节,所以了解堆栈大小很重要。您可以使用如下代码检查堆栈大小的限制

代码语言:javascript
复制
#include <sys/resource.h>

void checkStackSize( void )
{
    struct rlimit limits;

    if ( getrlimit( RLIMIT_STACK, &limits ) == 0 )
        printf( "soft_limit=%lld hard_limit=%lld\n", limits.rlim_cur, limits.rlim_max );
}

当我在osx上测试时,软限制是8MB,硬限制是64 8MB。在iOS设备上,这两个限制都是1MB。

注意:以下内容来自alloca的手册页

alloca()依赖于机器和编译器;不鼓励使用它。 alloca()有点不安全,因为它不能确保返回的指针指向有效和可用的内存块。所作的分配可能超出堆栈的范围,甚至可能深入内存中的其他对象,而alloca()无法确定这样的错误。避免使用大的无界分配的alloca()。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22693328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档