Jeter un pointeur sur un caractère ptr et vice versa

Le problème est simple. Si je comprends bien, GCC affirme que les caractères seront alignés sur les octets et alignés sur 4 octets dans un environnement 32 bits. Je connais également la norme C99 6.3.2.3 qui stipule que la transposition entre types de pointeurs mal alignés entraîne des opérations non définies. Que disent les autres normes de C à ce sujet? Il y a aussi beaucoup de codeurs expérimentés ici – toute vue à ce sujet sera appréciée.

int *iptr1, *iptr2; char *cptr1, *cptr2; iptr1 = (int *) cptr1; cptr2 = (char *) iptr2; 

Il existe une seule norme pour le C (celle de l’ISO), avec deux versions (1989 et 1999), plus quelques révisions mineures. Toutes les versions et révisions s’accordent sur les points suivants:

  • toute la mémoire de données est adressable sur octet, et les caractères sont des octets
  • ainsi, un caractère char* pourra traiter toutes les données
    • void* est identique à char* sauf que les conversions vers et depuis ne nécessitent pas de transtypage
  • la conversion de int* à char* fonctionne toujours, de même que la conversion vers int*
  • la conversion d’un caractère arbitraire char* en int* n’est pas garantie au travail

La raison pour laquelle les pointeurs de caractères fonctionnent est telle que vous pouvez, par exemple, copier des entiers de la mémoire vers un autre emplacement de la mémoire ou du disque, et inversement, ce qui s’avère être une chose très utile à faire en bas niveau. programmation, par exemple, bibliothèques graphiques.

Il y a big-endian et little-endian pour les processeurs, donc les résultats ne sont pas définis. Par exemple, la valeur 0x01234567 pourrait être 0x12 ou 0x67 pour un pointeur de caractère après la conversion.

Vous pouvez essayer de faire:

 iptr1 = atoi(cptr1); // val now = pointed by cptr1 cptr2 = atoi(iptr2); // val now = pointed by iptr2 

Cela a fonctionné pour moi dans DevCpp!