2016-12-29 2 views
4

Est-ce que C est portable/valide pour déréférencer un littéral entier traité comme une adresse? à savoir, si je veux définir une valeur de 64 bits à l'adresse de mémoire 0x12345678 à 123, est au moins par des normes C89 portable et valide suivant C,:Valable pour dé-référencer un littéral entier-comme-pointeur dans C

*(uint64_t *)(0x12345678) = 123ULL; 

je vois pas d'avertissements de compilation (testé par gcc -std=c89 -Wall input.c) , mais je me souviens avoir vu une question sur ce sujet il y a quelque temps où il était question de stocker l'adresse dans une variable intermédiaire plutôt que de dé-référencer directement un littéral entier (qui a été converti en une adresse de pointeur).

+0

Que voulez-vous dire portable? La seule fois où j'ai fait quelque chose comme ça, c'est en programmant pour un système embarqué où je suis sûr de ce que je trouverai dans cette adresse. À part cela, il n'y a pas de portabilité. – DeiDei

Répondre

3

Tant que l'adresse 0x12345678 est valide et possède un objet uint64_t, il n'y a aucun problème avec la distribution ou directement en utilisant un nombre entier. Mais il peut ne pas être une adresse valide dans toutes les plates-formes. Donc, si vous savez ce que vous avez à faire, c'est bien.

Les types de largeur fixe ont été introduits uniquement dans C99. Donc, je trouve paradoxal quand vous posez la question de la portabilité de la distribution à uint64_t* en C89 :)

+0

Bon point sur les types de largeur fixe. Merci pour l'info. – DevNull

+0

Addendum: Il n'existe aucun moyen * portable * d'obtenir des entiers 64 bits dans la plupart des systèmes/compilateurs C89 (puisque 'long long' n'existait pas à l'époque, et' long' est souvent de 32 bits). Certains compilateurs étendent ceci via (par exemple) '__int64', mais les mêmes étendent généralement C89 avec' 'de toute façon, donc on pourrait aussi bien l'utiliser. Ou, encore plus portatif: un custom 'types.h' qui définit' MYuint64' ou similaire (en utilisant 'long long',' ',' unsigned __int64' ou quoi que ce soit d'autre est disponible). –