以下代码有什么问题?

时间:2011-02-21 22:58:59

标签: c

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 个答案:

答案 0 :(得分:10)

int value[64];  

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

valueinitialize()的本地范围内定义,如果您认为有效,则在第一次迭代时返回内存位置,从而生成{{1}的内容} value[]之后的垃圾。

在本地范围内定义变量时,当函数到达终止时,变量将不再存在。返回指向局部变量的指针会调用Undefined Behavior,导致您访问(并使用)不应该存在的内存。

未定义的行为配偶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(如果malloc()成功或失败则为AKA),如果返回值不是{{1}确保你0记忆。

free()

您也可以在int main( ) { int * p; p = intialize(); if(p) { p[32] = 100; printf("%d", p[32]); free(p); } return 0; } 子句之外设置free(),因为if是安全的。

答案 1 :(得分:2)

'intialize'是一个拼写错误(尽管这是一个错误的拼写错误,所以会编译)。

我做对了吗?