Неожиданный результат при изменении местоположения возврата - PullRequest
0 голосов
/ 02 июня 2019

#include <stdio.h>

int* plusOne(int* digits, int digitsSize, int* returnSize){
    int* result=0;

    if (digits[digitsSize-1]<9){
        *returnSize=digitsSize;
        int* result = (int *)malloc(*returnSize*(sizeof(int)));
        memcpy( result, digits, *returnSize*(sizeof(int)) );
        result[digitsSize-1]= (result[digitsSize-1])+1;
    }

    return result;

}

int main()
{
    int array[3]={1,2,3};
    int* resultSize= malloc(sizeof(int));
    int* result = plusOne(&array,3,resultSize);
    printf("%i",result[2]);

    return 0;
}

Код выше segfaults в printf("%i",result[2]);, потому что результат по какой-то причине равен 0 ... Однако, когда я помещаю return result; в оператор if, тогда код работает как ожидалось.

Почемуэто тот случай?If будет оцениваться, и результат будет одинаковым независимо от ситуации.Это оптимизация компилятора?(Это просто пропускает оператор if?)

1 Ответ

2 голосов
/ 02 июня 2019

В вашей функции есть два объекта с идентификатором result plusOne().

int* plusOne(int* digits, int digitsSize, int* returnSize){
    int* result=0;
    //   ^^^^^^
    if (digits[digitsSize-1]<9){
        *returnSize=digitsSize;
        int* result = (int *)malloc(*returnSize*(sizeof(int)));
        //   ^^^^^^ inner result
        memcpy( result, digits, *returnSize*(sizeof(int)) );
        result[digitsSize-1]= (result[digitsSize-1])+1;
    }
    return result;
}

Когда вы возвращаетесь изнутри if, вы возвращаете внутреннее result; в противном случае вы возвращаете внешний.

Подсказка: ваш компилятор может предупредить вас о shadowing .

...