返回数组(警告:函数返回局部变量的地址)?
接口
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
}
答案 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编写的应用程序执行此操作,我建议您使用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]);
}
唯一的区别是NSMutableArray允许你在事后添加/删除元素。