请向我解释崩溃的原因。我有第3方代码,它与EXC_BAD_ACCESS意外崩溃

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

行memset(srm-> buffer,byte,srm-> buffer_size)发生崩溃;看来srm-> buffer的分配内存有问题。但是,如果我将alloca替换为malloc,则一切正常(没有崩溃)。

我在启用osx 10.9 ARC的系统上进行开发

我注意到苹果特有的一点:如果我在全局队列中运行代码,但在主队列中运行一切正常,则会发生崩溃。

最佳答案

听起来像是堆栈溢出,alloca will allocate from the stack,所以如果您尝试分配过多,将导致堆栈溢出,而malloc将从堆中分配更大的空间。没有办法知道when you overflow the stack with alloca

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

08-24 23:50