将限制限定的指针参数分配给本地的限制限定变量
在阅读C标准,6.7.3.1“ restrict
正式定义”后,我有以下误解。 我想知道以下代码是否会立即导致未定义的行为:
void foo(int *restrict p) { int *restrict q = p; }
很明显, q
被赋予基于另一个受限指针p
。 不清楚的是,这两个指针是否与同一个块(函数本身)相关联,或者与不同的块( p
与函数本身, q
与其复合语句体)相关联,因为,例如。
int *restrict p; { int *restrict q = p; }
不会导致未定义的行为(可以在子块中创建别名指针)。
MSVC ++中限制关键字和局部变量的最佳答案表明int *restrict q = p + 1;
会很好,但是[至少在C标准的情况下]并不是真的,因为表达式p + 1
仍然基于p
。
该块的定义见6.7.3.1 p2:
- 如果[某个指针声明]
D
出现在一个块内并且没有存储类extern
,那么让B
表示该块。 如果D
出现在函数定义的参数声明列表中,则让B
表示关联的块。 […]
那么函数的“关联块”与此上下文中的函数体是一样的吗? 因为我没有立即在文本前面找到对“相关块”一词的任何解释。