Возвращение массива (Внимание: функция возвращает адрес локальной переменной)? - PullRequest
4 голосов
/ 24 июля 2011

Возвращение массива (Внимание: функция возвращает адрес локальной переменной)?

interface

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 ]

12 голосов
/ 24 июля 2011

Вы должны выделить место для массива, вы возвращаете адрес массива, который был создан в стеке (следовательно, предупреждение о локальной переменной), если вы используете C, в этой функции используйте malloc (my_arr_size), если не используете obj -c's 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 () для указателя на эти данные.

0 голосов
/ 24 июля 2011

Если вы делаете это для приложения, написанного на 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 позволяет добавлять / удалять элементы после факта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...