0

我想要一个 ivar,它是指向 ac 数组的第一个元素的指针,但我希望 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.

另一件事是,如果您可以使用 C++ 构造和库,那么您可以考虑使用std::vector<int>而不是int *;

于 2013-05-07T14:20:00.693 回答