plain C có các con trỏ kiểu void - feature void, có thể được sử dụng như con trỏ tới bất kỳ kiểu dữ liệu nào.
Nhưng, giả sử tôi có sau struct:mảng loại void
struct token {
int type;
void *value;
};
nơi trường giá trị có thể trỏ đến char mảng, hoặc int, hay cái gì khác.
Vì vậy, khi phân bổ trường hợp mới của cấu trúc này, tôi cần:
1) cấp phát bộ nhớ cho cấu trúc này;
2) cấp phát bộ nhớ cho giá trị và gán cho trường giá trị.
Câu hỏi của tôi là - có cách nào để khai báo "mảng loại void", có thể được truyền sang bất kỳ loại nào khác như con trỏ trống không?
Tất cả những gì tôi muốn là sử dụng "mảng thành viên linh hoạt" (được mô tả trong 6.7.2.1 của tiêu chuẩn C99) có khả năng truyền sang bất kỳ loại nào.
Something như thế này:
struct token {
int type;
void value[];
};
struct token *p = malloc(sizeof(struct token) + value_size);
memcpy(p->value, val, value_size);
...
char *ptr = token->value;
Tôi cho rằng tuyên bố token-> giá trị như char hoặc mảng int và đúc để loại cần thiết sau này sẽ làm công việc này, nhưng có thể rất khó hiểu đối với một ai đó sẽ đọc mã sau.
Con trỏ kép? –
sử dụng 'char []' là tốt, vì 'sizeof (char) == 1' và bạn sẽ không bao giờ ngạc nhiên. Bạn có thể muốn xem xét các macro để truy cập 'p-> giá trị' với loại chính xác. –