2

我正在尝试在 ios 应用程序中使用纯 c 编程语言来实现一些功能。当方阵大小为 50(w=h=50)时,代码运行良好。如果我将矩阵的大小增加到 100,我会收到 EXC BAD ACCESS 消息。下面是我正在使用的代码:

    double solutionMatrixRed[w][h];
    double solutionMatrixGreen[w][h];
    double solutionMatrixBlue[w][h];
    double solutionMatrixAlpha[w][h];

    for(int x=0;x<w;x++)
    {
        for(int y=0;y<h;y++)
        {

            //NSLog(@"x=%d y=%d",x,y);
            solutionMatrixRed[x][y] = 0;
            solutionMatrixGreen[x][y] = 0;
            solutionMatrixBlue[x][y] = 0;
            solutionMatrixAlpha[x][y] = 0;
        }
    }

即使 w=h=100,总大小也应该是 100*100*8 Bytes 即 80KB,这是正常的。谁能告诉我可能出了什么问题?

4

3 回答 3

3

您的代码在自动存储*中分配所有四个矩阵,这可能是有限的。对于移动设备来说,即使是 80K 的四倍也可能太多了。

如果您需要处理那么多内存,请考虑使用以下方法从动态内存中分配它malloc

double (*solutionMatrixRed)[h] = malloc((sizeof *solutionMatrixRed) * w);
// allocate other matrices in the same way, then do your processing
free(solutionMatrixRed); // Do not forget to free the memory.


*通常被称为“堆栈”,由在实现自动存储中经常使用的数据结构的名称。

于 2012-09-18T14:21:01.957 回答
1

我相信 iOS 中的堆栈大小限制为 512 KB。在 w = 100 和 h = 100 时,您的数组将需要大约 312.5 KB。我怀疑您超出了堆栈大小,应该尝试在堆上分配数组(使用 malloc() 分配数组)。

于 2012-09-18T14:21:05.187 回答
1

因为您试图在堆栈上分配所有内存。虽然您应该使用动态分配(malloc)在堆上分配它:

double **solutionMatrixRed = malloc(h * sizeof(double *));
for(i=0; i<h; i++)
    solutionMatrixRed[i] = malloc(w * sizeof(double));
于 2012-09-18T14:22:46.530 回答