gpt4 book ai didi

c - 以下代码有什么问题?

转载 作者:行者123 更新时间:2023-12-04 11:04:11 24 4
gpt4 key购买 nike

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

上面是我在面试中被问到的示例代码。虽然我没有发现错误并且显然被拒绝了,但我很想知道这段代码到底出了什么问题。

最佳答案

int value[64];  

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

value 是在 initialize() 的本地范围内定义的,而且,如果您可以假设它是有效的,那么您会在第一次迭代时返回内存位置,因此在 value[0] 之后使 value[] 的内容成为垃圾。

当您在局部范围内定义一个变量时,该变量将在函数终止时不复存在。返回指向局部变量的指针会调用未定义行为,导致您访问(和使用)不应该访问(和使用)的内存。

未定义行为配合 ;)


如果你想让它正确,你应该做类似的事情:

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

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

并且如果 initialize() 返回 0 也检查你的 main() (也就是如果 malloc() 成功或失败),如果返回值不是 0,请确保您 free() 内存。

int main( )
{
int * p;

p = intialize();
if(p)
{
p[32] = 100;
printf("%d", p[32]);
free(p);
}
return 0;
}

您还可以在 if 子句之外使用 free(),因为执行 free(0) 是安全的。

关于c - 以下代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5072249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com