以下代码有什么问题?

sam*_*rat 2 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;
}
Run Code Online (Sandbox Code Playgroud)

以上是在采访中向我询问的示例代码.虽然我没有发现错误并且明显被拒绝,但我很想知道这段代码到底是什么问题.

小智 10

int value[64];  

for ( int i = 0; i < 64 ; i++)  
{
    value[i] = i;  
}
return value;
Run Code Online (Sandbox Code Playgroud)

value在本地范围内定义,initialize()并且,如果您可以假设它是有效的,则在第一次迭代时返回内存位置,从而生成value[]后面的垃圾内容value[0].

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

未定义的行为配偶 ;)


如果你想使它正确,你应该做的事情如下:

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

for ( int i = 0; i < 64 ; i++)  
{
    result[i] = i;  
}
return result;
Run Code Online (Sandbox Code Playgroud)

并且还检查你的main()if是否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;
}
Run Code Online (Sandbox Code Playgroud)

你也可以有free()外面的if条款,因为做一个free(0)是安全的.