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

问题描述 投票:0回答:2

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

界面

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
}
objective-c cocoa-touch
2个回答
12
投票

您应该为数组分配空间。如果您在该函数中使用 C,则返回在堆栈上创建的数组的地址(因此局部变量警告),如果不使用 Objective-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 样式声明,因此如果您在 Objective-C 中这样做,请告诉我,我可以更改我的答案的示例。

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


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 允许您事后添加/删除元素。

© www.soinside.com 2019 - 2024. All rights reserved.