2008-10-11 63 views
15

Có thể khởi tạo một mảng con trỏ tới cấu trúc không? Cái gì như:Làm thế nào tôi có thể khởi tạo một mảng con trỏ tới cấu trúc?

struct country_t *countries[] = { 
     {"United States of America", "America"}, 
     {"England", "Europe"}, 
     {"Ethiopia", "Africa"} 
    } 

tôi muốn làm điều đó để có được các đối tượng trong bộ nhớ không tiếp giáp, và các con trỏ để chúng trong bộ nhớ kề nhau ... Nhưng tôi không thể sử dụng bộ nhớ động, vì vậy tôi tự hỏi nếu nó có thể không có nó.

Trả lời

30

Vâng, mã của bạn sử dụng cấu trúc chứ không phải con trỏ đến cấu trúc. Có nhiều cách để làm những gì bạn tìm kiếm, bao gồm:

static struct country_t us = { "United States of America", "America" }; 
static struct country_t uk = { "England",     "Europe" }; 
static struct country_t et = { "Ethiopia",     "Africa" }; 

struct country_t *countries[] = { &us, &uk, &et, }; 

Có nhiều cách khác để làm điều đó với các trình khởi tạo được chỉ định và các ký tự hợp chất trong C99. Mục 6.5.2.5 'Văn học hợp chất' thể hiện cách thức:

struct country_t *countries[] = 
{ 
    &(struct country_t) { "United States of America", "America" }, 
    &(struct country_t) { "England",     "Europe" }, 
    &(struct country_t) { "Ethiopia",     "Africa" }, 
}; 

Tiêu chuẩn minh họa con trỏ đến cấu trúc có cuộc gọi hàm. Lưu ý rằng không phải tất cả các trình biên dịch C đều chấp nhận cú pháp C99 và các ký tự hợp chất này không có trong C89 (aka C90).

Chỉnh sửa: Được nâng cấp để sử dụng mã quốc gia ISO 3166 gồm 2 chữ cái. Cũng làm cho các cấu trúc được đặt tên thành các biến tĩnh - những biểu tượng này không hiển thị bên ngoài tệp trước (vì chúng không tồn tại) và bây giờ chúng không hiển thị bên ngoài tệp sau đó. Tôi tranh luận liệu có nên tạo ra bất cứ điều gì và quyết định không - nhưng sử dụng const khi bạn có thể nói chung là một ý tưởng hay. Ngoài ra, trong ví dụ, có 3 quốc gia ở 3 châu lục. Bạn có phải có nhiều quốc gia trong một lục địa duy nhất (tiêu chuẩn) không, bạn có thể muốn chia sẻ các chuỗi lục địa. Tuy nhiên, cho dù bạn có thể làm điều đó một cách an toàn (hay không) phụ thuộc vào các chi tiết của struct country_t (không được đưa ra), và liệu chương trình có được phép cập nhật bảng (trả về câu hỏi const-ness) hay không.

+1

Trong ví dụ đầu tiên, bạn nên đánh dấu tất cả các cấu trúc là 'tĩnh': chúng không cần hiển thị bên ngoài đơn vị biên dịch hiện tại và đang làm lộn xộn liên kết không gian tên bây giờ. – ephemient

+0

Đồng ý - Tôi quyết định không làm phức tạp câu trả lời với chi tiết đó, mặc dù tôi đã mã hóa giải pháp cho công việc của riêng tôi, mọi thứ có thể tĩnh (ẩn bên ngoài tệp) sẽ là. –

0

này làm việc cho tôi:


struct country_t { 
    char *fullname; 
    char *shortname; 
}; 

struct country_t countries[] = { 
     {"United States of America", "America"}, 
     {"England", "Europe"}, 
     {"Ethiopia", "Africa"} 
}; 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

Bạn có thể ngắn gọn và sử dụng hơn:


struct country_t { 
    char *fullname; 
    char *shortname; 
} countries[] = { 
     {"United States of America", "America"}, 
     {"England", "Europe"}, 
     {"Ethiopia", "Africa"} 
}; 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

Edit: tôi tìm thấy thông tin này tại The C Book

+2

Câu hỏi yêu cầu một mảng con trỏ đến cấu trúc, có nghĩa là câu trả lời của bạn bỏ lỡ điểm, phải không? –

+2

Bên cạnh đó, * Europe * là tên viết tắt của * England *? Nooooo waaay! :-) – Jens

Các vấn đề liên quan