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)是安全的.