更改座位的位置时出现意外结果

时间:2019-06-02 07:37:21

标签: c segmentation-fault


#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;
}

上面的代码在printf("%i",result[2]);处出现段错误,因为由于某种原因导致结果为0 ...但是,当我将return result;放在if语句中时,该代码将按预期工作。

为什么会这样?无论在这种情况下,都会对if进行评估,并且收益将相同。它是编译器优化吗? (它只是跳过if语句?)

1 个答案:

答案 0 :(得分:2)

函数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;否则,您将返回外部的。

提示:your compiler can warn you about shadowing