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;
}
以上是在采访中向我询问的示例代码。虽然我没有发现错误并且明显被拒绝,但我很想知道这段代码究竟是什么问题。
答案 0 :(得分:10)
int value[64];
for ( int i = 0; i < 64 ; i++)
{
value[i] = i;
}
return value;
value
在initialize()
的本地范围内定义,如果您认为有效,则在第一次迭代时返回内存位置,从而生成{{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'是一个拼写错误(尽管这是一个错误的拼写错误,所以会编译)。
我做对了吗?