Objective c 在内存中保留一个c数组,以便以后能够用指针访问它

Objective c 在内存中保留一个c数组,以便以后能够用指针访问它,objective-c,c,Objective C,C,我希望有一个ivar,它是指向c数组的第一个元素的指针,但我希望该ivar能够访问该c数组中的其他元素 @interface myClass : NSObject { int * _arrayElement; } @end @implementation myClass -(id)init { self = [super init]; if (self) { int A[50]; _arrayElement= &A; }

我希望有一个ivar,它是指向c数组的第一个元素的指针,但我希望该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将给我一个[5])。

您需要在堆上分配数组,而不是在堆栈上。在堆栈上分配的数组和其他变量超出范围时,系统会回收它们,这意味着您不能在声明它们的函数/块之外引用它们,从技术上讲,这称为未定义行为,实际上通常会导致代码崩溃。使用
malloc
。因此,不是:

int A[50];
_arrayElement = &A;
简单地说:

_arrayElement = (int*) malloc(50 * sizeof(int));
使用完内存后,请记住使用
free
释放内存:

free(_arrayElement);

可选的,可以使用C++代码>新< /COD>和<代码>删除>代码>关键字:< /P>

_arrayElement = new int[50];
要释放内存,请执行以下操作:

delete[] _arrayElement;
请注意,如果选择使用
new
delete
,则必须将源代码编译为Objective-C++代码。要使用Xcode执行此操作,将文件扩展名从
.m
更改为
.mm
就足够了


另一个问题是,如果您对使用C++构造和LIBs是可以的,那么您可以考虑使用<代码> STD::vector < /C> >而不是<代码> int */COD> >;p> 您需要在堆上而不是堆栈上分配数组。在堆栈上分配的数组和其他变量超出范围时,系统会回收它们,这意味着您不能在声明它们的函数/块之外引用它们,从技术上讲,这称为未定义行为,实际上通常会导致代码崩溃。使用

malloc
。因此,不是:

int A[50];
_arrayElement = &A;
简单地说:

_arrayElement = (int*) malloc(50 * sizeof(int));
使用完内存后,请记住使用
free
释放内存:

free(_arrayElement);

可选的,可以使用C++代码>新< /COD>和<代码>删除>代码>关键字:< /P>

_arrayElement = new int[50];
要释放内存,请执行以下操作:

delete[] _arrayElement;
请注意,如果选择使用
new
delete
,则必须将源代码编译为Objective-C++代码。要使用Xcode执行此操作,将文件扩展名从
.m
更改为
.mm
就足够了


另一个问题是,如果您对使用C++构造和LIBs是可以的,那么您可以考虑使用<代码> STD::vector < /C> >而不是<代码> int */COD> >;p> 也许你应该明确指出,你应该直接将它分配给_arrayElement成员(即_arrayElement=A),而不是像原始代码那样使用它的地址。好的一点,我会更改它。老实说,在看到本地数组后,我甚至没有阅读其余的代码(并使用

delete[]\u arrayElement;
)删除@HotLicks这不是假定Objective-C++(哪个OP没有指定并打开它会大大降低编译速度)?它怎么会比简单的
malloc()
更好?另外请注意,您可以简单地将实例变量声明为
intarrayelement[50]只要它在编译时的大小是固定的。这就省去了额外分配的需要。我不确定这是否会更好,但我可以添加它作为替代方案。也许可以明确指出,您应该直接将其分配给_arrayElement成员(即_arrayElement=A),而不是像原始代码中那样使用它的地址。好的一点,我会更改它。老实说,在看到本地数组后,我甚至没有阅读其余的代码
(并使用
delete[]\u arrayElement;
)删除@HotLicks这不是假定Objective-C++(哪个OP没有指定并打开它会大大降低编译速度)?它怎么会比简单的
malloc()
更好?另外请注意,您可以简单地将实例变量声明为
intarrayelement[50]只要它在编译时的大小是固定的。这节省了额外分配的需要。我不确定这是否会更好,但我可以添加它作为替代方案。