gpt4 book ai didi

c - 使用参数列表中的增量传递到函数缓冲区位置地址 - 为什么它是未指定的行为?

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:20 24 4
gpt4 key购买 nike

这个问题是关于使用递增索引将缓冲区位置传递给 sscanf。为了清楚起见,下面有两个代码片段,一个可以正常工作,另一个则不能。

工作代码是这样的:

sscanf(line, "%x %x %x %x %x %x %x %x - %x %x %x %x %x %x %x %x",
&buf[0], &buf[1], &buf[2], &buf[3],
&buf[4], &buf[5], &buf[6], &buf[7],
&buf[8], &buf[9], &buf[10], &buf[11],
&buf[12], &buf[13], &buf[14], &buf[15]);

无效代码是这样的:

buf_idx = 0;
sscanf(line, "%x %x %x %x %x %x %x %x - %x %x %x %x %x %x %x %x",
&buf[buf_idx++], &buf[buf_idx++], &buf[buf_idx++], &buf[buf_idx++],
&buf[buf_idx++], &buf[buf_idx++], &buf[buf_idx++], &buf[buf_idx++],
&buf[buf_idx++], &buf[buf_idx++], &buf[buf_idx++], &buf[buf_idx++],
&buf[buf_idx++], &buf[buf_idx++], &buf[buf_idx++], &buf[buf_idx++]);

第二个片段不会引发任何段错误,它只是不会按预期加载值。

我完全知道第二个片段是不好的 C 并且不推荐使用它,对于学术建议我想问一下不工作代码背后的基本原理,为什么它是未指定的行为 .

最佳答案

函数参数的计算顺序未指定。因此,您永远不知道 sscanf 将读取的 buf 的确切偏移量。

此外,您的代码调用 UB,因为函数参数评估在连续参数评估之间没有序列点。

int i = 0;
some_fun(++i, ++i); /* UB */
/* In practice some_fun may get arguments as (2, 2), (1, 1), (2, 1) etc */

关于c - 使用参数列表中的增量传递到函数缓冲区位置地址 - 为什么它是未指定的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26865739/

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