1

私は多くの 2D int および float C 配列を作成しており、それらのポインターを NSPointerArray に割り当てようとしていました。それらを作成してデータを入力している間はすべて問題ありませんが、配列に addPointer を実行すると、EXEC_BAD_ACCESS が発生します。Q1-なぜこれが間違っているのですか?Q2-calloc で作成された多くの 2D 配列へのアクセスを提供する最善の方法は何ですか?

- (NSPointerArray *)treeData{
   if (_treeData == nil) {
      _treeData = [[NSPointerArray alloc] init];
      int** VVD = createIntArray(3000,200); 
      [_treeData addPointer:VVD];
   }
  return _treeData; // addеd later to the post, exists in live code
}

参考のため

int** createIntArray(int n, int m)
{    
  int i=0;
   int* values = calloc(m*n, sizeof(int));
   int** rows = malloc(n*sizeof(int*));
   for ( i=0; i<n; ++i)
   {
       rows[i] = values + i*m;
   }
   return rows;

}

4

1 に答える 1

1

NSPointerArrayは、適切なオプションで初期化する必要があります。デフォルトでは、彼は渡されたポインタを保持しようとしますが、int **はNSObjectではないため、クラッシュします。代わりに、追加したメモリに触れないようにアレイに指示する必要があります。不透明なメモリオプションで初期化します

あなたはあなたが呼んでいるのと等しいinitだけinitWithOptions: NSPointerFunctionsStrongMemory
を呼んだinitWithOptions:NSPointerFunctionsOpaqueMemory

#import <Foundation/Foundation.h>

int** createIntArray(int n, int m)
{
    int i=0;
    int* values = calloc(m*n, sizeof(int));
    int** rows = malloc(n*sizeof(int*));
    for ( i=0; i<n; ++i)
    {
        rows[i] = values + i*m;
    }
    return rows;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        id _treeData = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsOpaqueMemory];
        int** VVD = createIntArray(3000,200);
        [_treeData addPointer:VVD];
    }

    NSLog(@"EOF");
}       
于 2013-02-17T13:35:06.887 に答える