Je ne sais pas ce que vous essayez de faire, mais je suppose que vous écrivez une sorte de firmware pour un microcontrôleur ou quelque chose de similaire. Votre question ressemble un peu plus au problème XY. C, étant un langage de programmation de bas niveau, dépend beaucoup plus des détails matériels qu'un langage de niveau supérieur tel que Ruby. Beaucoup dépendra du processeur et du système d'exploitation sous lequel ce code est exécuté. Essentiellement, vous posez des questions sur le comportement d'exécution d'un code, mais vous ne donnez pas assez d'informations sur l'endroit où ce code est exécuté.
Affecter des valeurs à des pointeurs directement ou non, n'importe où, cela dépend du processeur et du système d'exploitation. De même, tous les processeurs et ensembles d'instructions ne mappent pas les registres dans l'espace mémoire. Ainsi,
char * ptr = (char *) 0x1000;
OU
(uint32 volatile *) ptr = 0x00000001;
peut pointer vers un registre 32 bits ou peut pointer vers une mémoire physique ou peut pointer vers une adresse virtuelle valide ou peut pointer vers une adresse virtuelle invalide ou non mappée ou simplement pointer vers nulle part. Tout dépend du contexte matériel.
Quelle CPU/plateforme/système ciblez-vous? Quelle est la signification de l'adresse '0x1000' sur ce processeur/plate-forme/système? S'il s'agit d'un registre de 32 bits, vous ne pouvez pas lui écrire partiellement? –
Est-ce que le changement à volatile est la modification ou le changement à uint32 *? – Yunnosch
Les deux extraits de code ne sont pas liés les uns aux autres. Ma requête est liée à la manière d'affecter une valeur à une adresse. Quand je fais '* (volatile uint32 *) ptr = 0x00000001;' cela fonctionne très bien pour moi ici ptr pointe vers l'adresse cartographiée IO. Alors que lorsque je cours le premier petit fragment de code sur ma machine Linux, cela me donne une erreur de segmentation. –