Comme @MartinJames mentionné dans un commentaire, si vous avez besoin pour garantir que a
et b
sont dans la mémoire contiguë (ou au moins en mesure d'être traités comme tels, (edit) à moins que votre architecture/compilateur utilise une inhabituelle taille du bloc de mémoire/offset et forcé d'alignement qui aurait besoin de rembourrage pour être ajouté), vous devez utiliser un union
.
union overlap {
char all[8]; /* all the bytes in sequence */
struct { /* (anonymous struct so its members can be accessed directly) */
char a[4]; /* padding may be added after this if the alignment is not a sub-factor of 4 */
char b[4];
};
};
Vous ne pouvez pas accéder directement à la b
de a
(par exemple, a[6]
, comme vous l'avez demandé), mais vous pouvez avoir accès aux éléments de fois a
et b
par l'aide d' all
(par exemple, all[6]
se réfère à la même emplacement mémoire que b[2]
).
(Edit: Vous pouvez remplacer 8
et 4
dans le code ci-dessus avec 2*sizeof(int)
et sizeof(int)
, respectivement, pour être plus susceptible de correspondre à l'architecture d'alignement, notamment si le code doit être plus portable, mais alors vous devez être prudent afin d'éviter de faire des hypothèses sur la façon dont nombre d'octets dans a
, b
ou all
. Cependant, ce sera le travail sur ce qui sont probablement les plus courantes (1-, 2-et 4-octets) de mémoire alignements.)
Voici un exemple simple:
#include <stdio.h>
union overlap {
char all[2*sizeof(int)]; /* all the bytes in sequence */
struct { /* anonymous struct so its members can be accessed directly */
char a[sizeof(int)]; /* low word */
char b[sizeof(int)]; /* high word */
};
};
int main()
{
union overlap testing;
testing.a[0] = 'a';
testing.a[1] = 'b';
testing.a[2] = 'c';
testing.a[3] = '\0'; /* null terminator */
testing.b[0] = 'e';
testing.b[1] = 'f';
testing.b[2] = 'g';
testing.b[3] = '\0'; /* null terminator */
printf("a=%s\n",testing.a); /* output: a=abc */
printf("b=%s\n",testing.b); /* output: b=efg */
printf("all=%s\n",testing.all); /* output: all=abc */
testing.a[3] = 'd'; /* makes printf keep reading past the end of a */
printf("a=%s\n",testing.a); /* output: a=abcdefg */
printf("b=%s\n",testing.b); /* output: b=efg */
printf("all=%s\n",testing.all); /* output: all=abcdefg */
return 0;
}