c++ - 带有 float 据的 C 数组在 Objective C 类中崩溃 (EXC_BAD_ACCESS)

标签 c++ objective-c c audio core-audio

我正在做一些音频处理,因此混合了一些 C 和 Objective C。我已经设置了一个类来处理我的 OpenAL 接口(interface)和我的音频处理。我已将类后缀更改为

.毫米

...如 Core Audio 书中许多在线示例中所述。

我有一个在 .h 文件中声明并在 .mm 文件中实现的 C 风格函数:

static void granularizeWithData(float *inBuffer, unsigned long int total) {

    // create grains of audio data from a buffer read in using ExtAudioFileRead() method.

    // total value is: 235377
    float tmpArr[total];

    // now I try to zero pad a new buffer:
    for (int j = 1; j <= 100; j++) {
        tmpArr[j] = 0;
        // CRASH on first iteration EXC_BAD_ACCESS (code=1, address= ...blahblah)
    }
}

奇怪???是的,我完全不知道为什么这不起作用,但以下是有效的:

    float tmpArr[235377];

    for (int j = 1; j <= 100; j++) {
        tmpArr[j] = 0;
        // This works and index 0 - 99 are filled with zeros
    }

有人知道为什么我不能声明一个大小为“total”且具有 int 值的数组吗?我的项目使用 ARC,但我不明白为什么这会导致问题。当我在调试时打印'total'的值时,它实际上是正确的值。如果有人有任何想法,请帮助,这让我抓狂!

最佳答案

问题是该数组是在堆栈上分配的,而不是在堆上分配的。堆栈大小有限,因此您不能在其上分配 235377*sizeof(float) 字节的数组,它太大了。改用堆:

float *tmpArray = NULL;

tmpArray = (float *) calloc(total, sizeof(float)); // allocate it

// test that you actually got the memory you asked for

if (tmpArray)
{
  // use it

  free(tmpArray); // release it
}

请注意,您始终有责任释放在堆上分配的内存,否则会产生泄漏。

在您的第二个示例中,由于大小是先验已知的,因此编译器会在程序的静态空间中的某个位置保留该空间,从而使其能够运行。但是在您的第一个示例中,它必须即时执行,这会导致错误。但在任何情况下,在确保您的第二个示例有效之前,您应该尝试访问数组的所有元素,而不仅仅是前 100 个元素。

关于c++ - 带有 float 据的 C 数组在 Objective C 类中崩溃 (EXC_BAD_ACCESS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504170/

相关文章:

c++ - 何时在TriCore模拟器中加载操作数?

c++ - pqxx 返回刚刚插入的行的 id

ios - 是否有充分的理由从自定义 UIView 指向 UIViewController

c - 源文件中的static/extern有什么用?

c - 仅打印 "An error occurred in the program!"

c - 将数组名称分配给指向字符数组的指针

c++ - 有没有更好的方法可以遍历数组中的每个元素而不使用索引的for循环?

c++ - setlocale 错误 LNK2019

ios - 获取一年中的星期几

ios - 如何从字符串中获取 NSDate