2

iOSアプリで純粋なCプログラミング言語を使用していくつかの機能を実現しようとしています。正方行列のサイズが50(w = h = 50)の場合、コードは正常に実行されます。マトリックスのサイズを100に増やすと、EXCBADACCESSメッセージが表示されます。以下は私が使用しているコードです:

    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バイトで、これは通常の80KBです。誰かが何が間違っている可能性があるかを知ることができますか?

4

3 に答える 3

3

コードは、4つの行列すべてを自動ストレージ*に割り当てますが、これは制限される場合があります。80Kの4倍でも、モバイルデバイスには多すぎる可能性があります。

それだけのメモリを処理する必要がある場合は、次を使用して動的メモリからメモリを割り当てることを検討して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のスタックサイズは512KBに制限されていると思います。w=100およびh=100の場合、アレイには約312.5KBが必要になります。スタックサイズを超えていると思われるので、ヒープに配列を割り当ててみてください(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 に答える