考虑以下两个例子。 示例1
typedef struct { int *p; } T;
T a = { malloc(sizeof(int) };
free(a.p); // a.p is now indeterminate?
T b = a; // Access through a non-character type?
示例2
void foo(int *p) {}
int *p = malloc(sizeof(int));
free(p); // p is now indeterminate?
foo(p); // Access through a non-character type?
问题
上述示例中是否有任何一个会引起未定义的行为?
背景
这个问题是针对这个讨论提出的。建议是,例如,指针参数可以通过x86段寄存器传递给函数,这可能会导致硬件异常。
从C99标准中,我们了解到以下内容(重点是我的):
[3.17] 不确定的值 - 未指定的值或陷阱表示
然后:
[6.2.4 p2] 当对象指向达到其生命周期的末尾时,指针的值变得不确定。
然后:
[6.2.6.1 p5] 某些对象表示不需要表示对象类型的值。如果对象的存储值具有这样的表示,并且被lvalue表达式读取而没有字符类型,则行为未定义。如果这样的表示是由修改所有或任何部分的对象的副作用所产生的,而这些对象不具有字符类型的lvalue表达式,则行为未定义。这种表示称为陷阱表示。
综合考虑,我们对访问指向“死”对象的指针有什么限制?
补充说明
尽管我引用了C99标准,但我想知道在任何C++标准中行为是否有所不同。
malloc
和free
早已引起未定义的行为。 根据7.1.3:“如果程序在保留的上下文中声明或定义标识符(除7.1.4允许的情况外),或将保留的标识符定义为宏名称,则其行为未定义。” - R.. GitHub STOP HELPING ICE