gpt4 book ai didi

c - 不是左值和序列点限制的数组

转载 作者:太空狗 更新时间:2023-10-29 14:58:52 25 4
gpt4 key购买 nike

在 ISO C99 中,不是左值的数组仍然会退化为指针,并且可能带有下标,尽管它们可能不会在下一个序列点之后被修改或使用。 ( source )

我了解此功能允许在函数返回包含数组的结构的情况下进行数组索引,这在 C89 ( http://yarchive.net/comp/struct_return.html ) 中是不允许的

你能帮我理解为什么在下一个序列点之后限制使用/修改它吗?

最佳答案

请注意,OP 引用的文本来自 GCC 文档。 C99 中支持该引用的相关文本是:

C99 6.5.2.2/5

If an attempt is made to modify the result of a function call or to access it after the next sequence point, the behavior is undefined.

以及前言中的更改列表:

conversion of array to pointer not limited to lvalues

我没有要比较的 C89 文本,但是 C99 对数组到指针转换的描述 (6.3.2.1/3) 没有提到对数组作为左值的任何限制。此外,关于下标的 C99 部分 (6.5.2.1/2) 讨论了作为 后缀表达式 下标的表达式,它也没有提到左值。


考虑这段代码:

struct foo
{
char buf[20];
};

struct foo foo(char const *p) { struct foo f; strcpy(f.buf, p); return f; }

int main()
{
char *hello = foo("hello").buf;
char *bye = foo("bye").buf;

// other stuff...

printf("%s\n", hello);
printf("%s\n", bye);
}

指针hellobye 指向哪里?该子句的目的是说编译器不必将所有返回的对象都保留在内存中的某个地方,以使这些指针无限期地保持有效。

相反,hello 仅在下一个 ; 之前有效(在这种情况下(或通常的下一个序列点))。这让编译器可以自由地实现按值返回结构作为隐藏指针参数,正如 Chris Torek 在他的优秀帖子中所描述的那样,它可以在当前语句结束时“释放”。

注意。 C99 的情况并不像 Chris 的帖子中描述的那么简单,因为必须执行以下操作:

printf("%s %s\n", foo("hello").buf, foo("bye").buf);

我安装的 gcc 4.8 似乎是正确的 - 它与 -std=c99 一起工作,而与 -std=c89 一起工作。

关于c - 不是左值和序列点限制的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25759295/

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