Tôi có một công đoàn trong C như thế này:vị trí bộ nhớ của các nguyên tố trong C/C++ đoàn
union AUnion {
struct CharBuf {
char *buf;
size_t len;
} charbuf;
uint8_t num;
double fp_num;
};
Câu hỏi của tôi là, tôi có thể đảm bảo rằng nếu được như sau:
union AUnion u;
Sau đó, sau đây là đúng:
&u == &u.num
&u == &u.fp_num
&u == &u.charbuf
Tức là tất cả chúng bắt đầu ở đầu phân đoạn bộ nhớ nơi u
được lưu trữ.
Trong trường hợp chương trình C này được biên soạn với gcc version 5.3.0
và -std=c11
ở trên là đúng:
#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));
}
Vì nó in:
1
1
1
Biên dịch mã trên như C++ 11 với cùng một kết quả trình biên dịch trong cùng một đầu ra như biên dịch nó như C11.
Nhưng là hành vi tiêu chuẩn này? Nó không xác định? Tôi có thể dựa vào hành vi này với hầu hết các trình biên dịch C không? Tôi có thể mong đợi hành vi này với các trình biên dịch C++ không?
C++ không đối xử với bất kỳ công đoàn nào khác với c –
@UriBrecher thực sự có nhiều khác biệt –
@ M.M: Vậy hãy nói rằng 'union' khác với C & C++ như thế nào? Liệt kê ra nhiều sự khác biệt Nếu bạn nghĩ vậy !!! – Destructor