【发布时间】:2019-07-25 03:04:42
【问题描述】:
这种声明在 C 中的错误是否有原因?
short foo()
{
short x,y,z;
y=24;
z = x + y;
return z;
}
【问题讨论】:
标签: c memory memory-leaks return declaration
这种声明在 C 中的错误是否有原因?
short foo()
{
short x,y,z;
y=24;
z = x + y;
return z;
}
【问题讨论】:
标签: c memory memory-leaks return declaration
声明没有错本身,但是代码有问题:
short foo(void) 优于 short foo()。前者说该函数不带参数。后者使其具有灵活性,这涉及许多可能导致错误发生的问题。z = x + y; 中,x 没有被赋值。然后代码的行为是未定义的。 (这是由于一个特殊规则,即使用具有自动存储持续时间且既没有被赋予值也没有被占用其地址的对象具有 C 标准未定义的行为。)【讨论】:
z 的返回值将是未定义的行为,因为您没有在此函数中初始化 x 变量的值。这个函数的返回值会不一致,有时是24,有时是另一个值。
【讨论】:
z 更糟糕,只是具有未指定的值。根据 C 2018 6.3.2.1 2,C 标准未定义整个行为:z 可以有任何值,可能会发生陷阱,可以在优化期间删除对函数的调用等等。
x 将从函数 foo 的堆栈中删除。调用者将控制x 变量本身。调用者也需要初始化x。