【发布时间】:2015-04-19 15:43:40
【问题描述】:
N1570 声明这是未定义的行为:
§J.2/1 使用具有自动存储持续时间的对象的值 虽然它是不确定的(6.2.4、6.7.9、6.8)。
在这种情况下,我们的指针有一个不确定的值:
§6.7.9/10 如果具有自动存储持续时间的对象不是 显式初始化,它的值是不确定的。如果一个对象 具有静态或线程存储持续时间未显式初始化, 那么:
——如果是指针类型,则初始化为空指针;
然后我假设以下测试程序表现出未定义的行为:
#include <stdio.h>
int main(void) {
char * ptr;
printf("%p", (void*)&ptr);
}
我最关心的是strtol 函数。首先引用N1570中与endptr参数相关的部分:
§7.22.1.4/5 如果主题序列具有预期的形式并且 base 的值为零,字符序列以 第一个数字被解释为一个整数常量,根据 6.4.4.1 的规则。 [...]指向最终字符串的指针存储在
endptr指向的对象,前提是endptr不为空 指针。§7.22.1.4/7 如果主题序列为空或没有 预期形式,不进行转换;
nptr的值为 存储在endptr指向的对象中,前提是endptr是 不是空指针。
这意味着endptr 需要指向一个对象,并且endptr 在某些时候被取消引用。例如this implementation does so:
if (endptr != 0)
*endptr = (char *)(any ? s - 1 : nptr);
然而,this highly upvoted answer 和 this man page 都显示 endptr 被传递给 strtol 未初始化。是否有例外使这种行为不是未定义的?
【问题讨论】:
-
您使用的不是指针的值,而是存储指针值的变量的地址。这是明确定义的。
标签: c pointers language-lawyer undefined-behavior