strtol中的别名参数

6

根据C11(n1570)的§7.22.1.4,下面是如何声明strtol的:

#include <stdlib.h>

long int strtol (const char *restrict nptr,
                 char **restrict endptr,
                 int base);

据我所知,restrict 关键字意味着由左值 *nptr 引用的对象只能使用它或直接派生自它的值进行访问。
然而,很多程序员,甚至是有经验的程序员,会以以下方式使用 strtol
#include <stdlib.h>

strtol (p, &p, 10);

在这种情况下,**endptr == **&p == *p == *nptr,行为是未定义的。对吗?

1
之前我写过一篇关于“restrict”作为规范元素令人沮丧的博客文章,因为它隐含地涉及到实现。如果一个strtol()实现同时访问**endptr*nptr,那么将p&p传递给它是未定义的。如果没有,则传递这些参数是没有问题的。由“restrict”所暗示的规范只有在与应该被规范隐藏的实现相关时才有意义。http://blog.frama-c.com/index.php?post/2012/08/02/restrict-not-modular - Pascal Cuoq
1个回答

8

strtol 中,并不是通过 endptr 访问任何内容。只有完全独立的对象 *endptr 被访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接