L'accès à une chaîne C au-delà du caractère nul final en soi n'est jamais un comportement indéfini. Pourtant, nous pouvons rendement de comportement non défini de cette façon, mais pour une toute autre raison:
Si le caractère nul final arrive à résider à la dernière position dans le tableau de caractères réservé à la chaîne, nous accéder à ce tableau sous-jacent hors de ses limites si nous accédons à la chaîne au-delà de sa fin. Ce hors-limites d'accès est ce qui donne vraiment le comportement non défini ...
Edit:
[de côté: que UB]
UB, comportement non défini, est un comportement qui ne peut pas être défini, car il n'y a pas de comportement significatif pour. S'appuyer sur un comportement indéfini peut entraîner n'importe quoi, y compris obtenir les résultats attendus, mais peut échouer lamentablement à tout autre moment (par exemple.sur une autre plate-forme, après avoir changé de version du compilateur, après simplement recompiler, même après avoir redémarré un seul et même programme). Ainsi, un programme reposant sur un comportement indéfini est considéré comme n'étant pas bien défini. Exemple: Déréférencement d'un pointeur vers un objet qui a déjà été supprimé (un "pointeur flottant"), ou proche de la question: accès à un tableau hors limites (peut entraîner l'accès à la mémoire non processus en cours ou même pas existant, mais pourrait lire ou (mauvais !!!) écraser la mémoire d'un objet totalement différent qui se trouve à l'adresse donnée (il ne doit même pas être le même objet à chaque fois que votre programme s'exécute, pas même dans un seul programme)
Un comportement indéfini ne doit pas être confondu avec un comportement non spécifié (ou de manière synonyme, comportement défini par l'implémentation): dans ce cas, le comportement pour une entrée donnée est bien défini, mais il est laissé au fournisseur du compilateur pour définir le comportement dans certaines limites raisonnables données. Exemple: décalage vers la droite des entiers négatifs - il peut se produire avec ou sans extension de signe (ce qui peut être un décalage arithmétique ou logique). Lequel s'applique n'est pas spécifié par la norme, mais l'utilisation du décalage droit sur les entiers négatifs est bien définie.
Non, la mémoire est allouée et il n'y a pas d'UB dans ce cas. – user0042
C'est bien sauf que 'sizeof' retournera la taille du tableau, pas la longueur de la chaîne (si c'est ce que vous vouliez). –