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

时间:2011-07-24 00:23:27

标签: 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
}

2 个答案:

答案 0 :(得分:12)

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

示例:

int *my_arr = calloc(10, sizeof(int)); //make sure we get zeroed memory
//fill array
return my_arr; //should no longer give a warning

完成后,只需使用free(my_arr)和release一样。我在C中做到这一点的原因是因为我可以看到你正在返回一个int *类型并使用C样式声明,所以如果你在Obj-c中这样做,请告诉我,我可以改变我的答案的例子。

您收到此错误的原因是因为本地数组被放入堆栈,当您返回该数组时,您将返回堆栈帧中的地址。问题是,当该方法完成执行时,堆栈帧不再有效,因此您不能指望该帧上的任何数据有效(尽管有时这种方法有效,但它被认为是不好的做法)。通过在堆上分配该数组,您可以返回一个堆地址,确保数据存在,直到您对指向该数据的指针调用free()。​​

答案 1 :(得分:0)

如果您为使用Objective-C编写的应用程序执行此操作,我建议您使用NSArrayNSArray是不可变数组的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]);
}

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