Что не так со следующим кодом? - PullRequest
2 голосов
/ 22 февраля 2011
int *intialize(void) 
{
    int value[64];

    for ( int i = 0; i < 64 ; i++)
    {
        value[i] = i;

       return value;   
    }

}  

int main( )
{
    int * p;

    p = intialize();
    p[32] = 100;
    printf("%d", p[32]);

    return 0;
}

Выше приведен пример кода, который мне задали в интервью. Хотя я не смог найти ошибку и, очевидно, отклонил ее, мне любопытно узнать, что именно не так с этим кодом.

Ответы [ 2 ]

10 голосов
/ 22 февраля 2011
int value[64];  

for ( int i = 0; i < 64 ; i++)  
{
    value[i] = i;  
}
return value;

value определено в локальной области действия initialize(), а также, если вы предполагаете, что это допустимо, вы возвращаете ячейку памяти на первой итерации, что делает содержимое value[] мусором после value[0] .

Когда вы определяете переменную в локальной области видимости, она перестает существовать, когда функция достигает завершения. Возврат указателя на локальную переменную вызывает неопределенное поведение, поскольку вы не должны обращаться к памяти (и использовать).

Неопределенное поведение помощник ;)


Если вы хотите исправить это, вы должны сделать что-то вроде:

int  * result = malloc(sizeof(int)* 64);  
if(!result)
    return 0;

for ( int i = 0; i < 64 ; i++)  
{
    result[i] = i;  
}
return result;

А также проверьте в main(), возвращает ли initialize() 0 или нет (AKA, если malloc() прошло успешно или не удалось), и если возвращаемое значение не было 0, убедитесь, что free() память.

int main( )
{
    int * p;

    p = intialize();
    if(p)
    {
         p[32] = 100;
         printf("%d", p[32]);
         free(p);
    }
    return 0;
}

Вы также можете иметь free() вне условия if, потому что выполнение free(0) безопасно.

2 голосов
/ 22 февраля 2011

'intialize' - это опечатка (хотя это непротиворечивая опечатка, поэтому она будет компилироваться).

Правильно ли я понял?

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