0

ac配列の最初の要素へのポインターであるivarが必要ですが、そのivarがそのc配列の他の要素にアクセスできるようにしたいです。

@interface myClass : NSObject {
    int * _arrayElement;
} 
@end

@implementation myClass
-(id)init {
    self = [super init];
    if (self) {
        int A[50];
        _arrayElement= &A;
    }
    return self;
}
@end

このメソッドが終了すると、c 配列がスタックから消え、ポインターをシフトして他の要素にアクセスできなくなります (_arrayElements + 5 で A[5] が得られます)。

4

1 に答える 1

3

スタックではなくヒープに配列を割り当てる必要があります。スタックに割り当てられた配列やその他の変数は、スコープ外になるとシステムによって再利用されます。つまり、それらが宣言されている関数/ブロックの外でそれらを参照することはできません。技術的には、これは未定義の動作と呼ばれ、実際には未定義の動作と呼ばれます。通常、コードがクラッシュします。を使用しmallocます。したがって、代わりに:

int A[50];
_arrayElement = &A;

単に:

_arrayElement = (int*) malloc(50 * sizeof(int));

free使い終わったら、忘れずにメモリの割り当てを解除してください。

free(_arrayElement);

newまたは、キーワードとdeleteキーワードを使用して、メモリ C++ スタイルを割り当ておよび割り当て解除することもできます。

_arrayElement = new int[50];

そして、メモリを解放するには:

delete[] _arrayElement;

new使用することを選択した場合、deleteソースを Objective-C++ コードとしてコンパイルする必要があることに注意してください。Xcode でこれを行うには、ファイルの拡張子を から に変更するだけで十分.mです.mm

もう 1 つのことは、C++ コンストラクトとライブラリの使用に問題がなければ、std::vector<int>代わりにint *;を使用することを検討できることです。

于 2013-05-07T14:20:00.693 に答える