ich eine Vereinigung in C wie folgt aussehen:Speicher Position der Elemente in C/C++ Union
union AUnion {
struct CharBuf {
char *buf;
size_t len;
} charbuf;
uint8_t num;
double fp_num;
};
Meine Frage ist, kann ich garantieren, dass die folgende wenn gegeben:
union AUnion u;
dann die folgende Bedingungen erfüllt sind:
&u == &u.num
&u == &u.fp_num
&u == &u.charbuf
Dh sie alle am Anfang des Speichersegments beginnen, wo u
gespeichert wird.
Im Falle dieses C-Programm kompiliert mit gcc version 5.3.0
und -std=c11
die oben gilt:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
union AUnion {
struct CharBuf {
char *buf;
size_t len;
} charbuf;
uint8_t num;
double fp_num;
};
int main(void)
{
union AUnion u;
printf("%d\n", ((void*)&u) == ((void*)&u.charbuf));
printf("%d\n", ((void*)&u.charbuf) == ((void*)&u.num));
printf("%d\n", ((void*)&u.num) == ((void*)&u.fp_num));
}
Wie druckt:
1
1
1
Kompilieren des Codes oben als C++ 11 mit der Derselbe Compiler führt zu der gleichen Ausgabe wie er als C11 kompiliert wird.
Aber ist das standardisiertes Verhalten? Ist es undefiniert? Kann ich mich bei den meisten C-Compilern auf dieses Verhalten verlassen? Kann ich dieses Verhalten auch mit C++ Compilern erwarten?
C++ behandelt Union nicht anders als c –
@UriBrecher tatsächlich gibt es viele Unterschiede –
@ M.M: Dann sagen, dass wie "Union" unterscheidet sich in C & C++? Listen Sie die vielen Unterschiede auf Wenn Sie so denken !!! – Destructor