将限制限定的指针参数分配给本地的限制限定变量

在阅读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:

  1. 如果[某个指针声明] D出现在一个块内并且没有存储类extern ,那么让B表示该块。 如果D出现在函数定义的参数声明列表中,则让B表示关联的块。 […]

那么函数的“关联块”与此上下文中的函数体是一样的吗? 因为我没有立即在文本前面找到对“相关块”一词的任何解释。