Affectation d’un argument de pointeur qualifié ressortingct à une variable locale qualifiée ressortingct

Après avoir lu la norme C, 6.7.3.1 «Définition formelle de ressortingct », j’ai le malentendu suivant. Je me demande si le code suivant provoque instantanément un comportement indéfini:

 void foo(int *ressortingct p) { int *ressortingct q = p; } 

Il est clair que la valeur atsortingbuée à q est basée sur un autre pointeur restreint p . Ce qui n’est pas clair, c’est que ces deux pointeurs soient associés au même bloc (la fonction elle-même) ou à des blocs différents ( p avec la fonction elle-même, q avec son corps d’instruction composé), car.

 int *ressortingct p; { int *ressortingct q = p; } 

ne provoque pas de comportement indéfini (il est correct de créer des pointeurs d’alias dans des sous-blocs).

La réponse principale dans MSVC ++ restreint le mot clé et les variables locales suggère que int *ressortingct q = p + 1; ça irait, cependant [du moins, dans le cas de la norme C], ce n’est pas vrai, car l’expression p + 1 est toujours basée sur p .

La définition du bloc est au 6.7.3.1 p2:

  1. Si [une certaine déclaration de pointeur] D apparaît dans un bloc et n’a pas de classe de stockage extern , laissez B désigner le bloc. Si D apparaît dans la liste des déclarations de parameters d’une définition de fonction, notons B le bloc associé. […]

Ainsi, “le bloc associé” de la fonction est-il la même chose que le corps de la fonction dans ce contexte? Parce que je n’ai pas trouvé instantanément d’explication du terme “bloc associé” plus haut dans le texte.