Objective c 返回数组(警告:函数返回局部变量的地址)?

Objective c 返回数组(警告:函数返回局部变量的地址)?,objective-c,cocoa-touch,Objective C,Cocoa Touch,返回数组(警告:函数返回局部变量的地址) 接口 int* decimalConversion(int iX); 实施 int* decimalConversion(int iX){ int iMult[10] = {0,0,0,0,0,0,0}; ... return iMult; // <-- Warning: Function returns address of local variable } int*小数转换(intix){ int iMult

返回数组(警告:函数返回局部变量的地址)

接口

int* decimalConversion(int iX);

实施

int* decimalConversion(int iX){
    int iMult[10] = {0,0,0,0,0,0,0};

    ...

    return iMult;  // <-- Warning: Function returns address of local variable
}
int*小数转换(intix){
int iMult[10]={0,0,0,0,0,0};
...

return iMult;//您应该为数组分配空间,如果在该函数中使用C,则返回在堆栈上创建的数组的地址(因此返回局部变量警告),如果不使用obj-C的alloc,则使用malloc(my_arr_size)

例如:

int *my_arr = calloc(10, sizeof(int)); //make sure we get zeroed memory
//fill array
return my_arr; //should no longer give a warning
使用它时,只需使用与release相同的free(my_arr)。我在C中这样做的原因是因为我可以看到您正在返回int*类型并使用C样式声明,所以如果您在Obj-C中这样做,请让我知道,我可以更改我的答案示例


出现此错误的原因是,本地数组放在堆栈上,当您返回该数组时,将返回堆栈帧中的地址。问题是,当该方法完成执行时,堆栈帧不再有效,因此您不能期望该帧上的任何数据都有效(虽然在某些情况下这确实有效,但这被认为是不好的做法)。通过在堆上分配该数组,您可以返回一个堆地址,在调用free()之前,您的数据将被保证存在该堆地址如果您是为Objective-C编写的应用程序执行此操作,我建议使用
NSArray
NSArray
是针对不可变数组的Objective-C类,不需要手动分配内存。唯一的缺点是必须将整数封装在
NSNumber
对象。例如:

NSArray * getNums (int num) {
    NSArray * result = [NSArray arrayWithObjects:[NSNumber numberWithInt:num-1], [NSNumber numberWithInt:num], [NSNumber numberWithInt:num+1], nil];
    return result;
}
...
NSArray * myList = getNums(10);
NSLog(@"First: %d", [[myList objectAtIndex:0] intValue]);
NSLog(@"Second: %d", [[myList objectAtIndex:1] intValue]);
NSLog(@"Third: %d", [[myList objectAtIndex:2] intValue]);
您也可以这样做:

NSArray * getNums (int num) {
    NSMutableArray * array = [NSMutableArray array];
    [array addObject:[NSNumber numberWithInt:num-1]];
    [array addObject:[NSNumber numberWithInt:num]];
    [array addObject:[NSNumber numberWithInt:num+1]];
    return array;
}
...
NSArray * myList = getNums(10);
for (int i = 0; i < [myList count]; i++) {
    NSLog(@"myList[%d] = %d", i, [myList objectAtIndex:i]);
}
NSArray*getNums(int num){
NSMutableArray*数组=[NSMutableArray];
[array addObject:[NSNumber numberWithInt:num-1]];
[array addObject:[NSNumber numberWithInt:num]];
[array addObject:[NSNumber numberWithInt:num+1]];
返回数组;
}
...
NSArray*myList=getNums(10);
对于(int i=0;i<[myList count];i++){
NSLog(@“myList[%d]=%d”,i,[myList objectAtIndex:i]);
}

唯一的区别是NSMutableArray允许您在事件发生后添加/删除元素。

好的,然后按照我的答案进行操作,您应该会很好:)不确定为什么会清除警告?使用calloc声明数组与仅声明带有“[]”的数组两者都产生一个指针。函数返回的结果在两种情况下都是相同的。我只是得到了另一个的警告??关于calloc或malloc,根据方法调用的不同,我必须使用“retain”或数组丢失。所以我不理解其中的区别?当使用[]你在堆栈上定义它是因为大小是已知的,当你用malloc或alloc定义它时,你在堆中定义它,这与堆栈帧不同,在释放你请求的堆块之前,它总是有效的。嗯……如果内存数组放在堆栈上,那么你就在使用push和pop。你不能在不弹出所有内容的情况下对它进行索引,以获得to该项,将其推到堆栈上的其他位置以保留它?,然后将其推回到堆栈上以保留数组。使用数组索引内存是在堆上完成的动态内存。@jdl,ummmm否。您可以使用编译器所做的指针算法。他的问题是,一旦该方法完成,堆栈帧就无效(不保证数据的正确性),因此数据可能无效,因为无效的堆栈帧不会被保留