2011-07-24 75 views

回答

12

你應該爲數組分配空間,你回來這是在棧上創建了一個陣列(因此局部變量的地址警告),如果你在那個函數中使用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 

完成後用它只需使用免費(my_arr)一樣釋放。我在C中這樣做的原因是因爲我可以看到你返回了一個int *類型並使用了C風格的聲明,所以如果你在Obj-c中使用它,請告訴我,我可以更改我的答案示例。

您收到此錯誤的原因是因爲本地陣列得到放進堆疊,當你返回數組你堆棧幀中返回的地址。問題是,當這個方法完成執行時,堆棧幀不再有效,因此你不能指望那個幀上的任何數據是有效的(雖然有些情況下這種方法可行,但它被認爲是不好的做法)。通過在堆上分配這個數組,你可以返回一個堆地址,在這個地址你的數據被保證存在,直到你指向該數據指針的free()。

+0

我在init中添加了我的數組...請參閱上面,謝謝 –

+0

好吧,然後按照我的答案,你應該只是:) –

+0

不知道爲什麼會清除警告?使用calloc聲明一個數組而不僅僅是聲明一個帶有「[]」的數組都會產生一個指針。在這兩種情況下,函數返回的答案都是相同的。我只是得到另一個警告? 對於釋放calloc或malloc的,這取決於方法調用,我必須使用「保留」或陣列丟失。所以我不明白區別? –

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裏可以讓你在事後添加/刪除元素。

+0

我在init中添加了我的數組...請參閱上文,謝謝 –

相關問題