[20] làm gì? Nó có nghĩa là gì?
Các ý kiến dưới đây cho thấy danh pháp chung cho các phần của cấu trúc của bạn :
struct Person { //struct name (Person)
char name[50]; // \
int citNo; // --struct members
float salary; // /
} prsn[20]; // instance of struct Person array
Điều này [20]
chỉ ra rằng ví dụ struct Person
này là một mảng gồm 20 bộ sưu tập riêng biệt của 3 thành viên. Mỗi phần tử của mảng có thể được truy cập bằng cách sử dụng ký hiệu mảng. Ví dụ: trong một vòng lặp:
int main(int argc, char *argv[])
{
for(int i=0;i<20;i++)// note i goes from 0 to 19
{
//.....
//assuming members have been populated
printf( "%d)\nName is: %d\ncitNo is: %d salary is: %f\n\n", prsn[i].name, prsn[i].citNo, prsn[i].salary);
}
return 0;
}
[20] có giới hạn tên thành 20 (từ 50) hoặc giới hạn prsn
từ prsn[1]
đến prsn[20]
không?
Các thành viên name[50]
xác định một mảng 50 char. Kích thước của nó không bị ảnh hưởng theo bất kỳ cách nào bởi [20]
chỉ mục được sử dụng để định kích thước mảng của struct. tức là như bạn đã định nghĩa, có 20 trường hợp prsn
, mỗi trường hợp chứa 3 thành viên : char [50]
, int
và float
. Và theo định nghĩa của bạn, 20 trường hợp được tạo bởi [20]
cho phép mảng được truy cập với các giá trị chỉ mục từ đó 0
đến 19
. (Xem hình minh họa vòng lặp ở trên.)
EDIT để giải quyết câu hỏi OP trong ý kiến:
Và tôi phải làm gì nếu tôi muốn làm cho các yếu tố không giới hạn?
Nếu bạn muốn sử dụng dấu ngoặc rỗng, ( []
) định nghĩa phải bao gồm danh sách khởi tạo cấu trúc . Ví dụ:
... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};
Nếu kích thước của mảng cấu trúc không được biết đến tại thời điểm biên dịch và cần được định kích thước theo thông tin chỉ có sẵn trong thời gian chạy, thì có thể sử dụng cấp phát bộ nhớ động hoặc VLA . Đầu tiên, đối với bộ nhớ động, thay vì xác định bằng ký hiệu mảng, hãy tạo một thể hiện con trỏ:
... } *prsn;
Sau đó, trong một hàm, sử dụng calloc
hoặc malloc
để tạo bộ nhớ cho 1000 trường hợp:
int someFunction(void)
{
prsn = calloc(1000, sizeof(struct Person));
if(prsn)
{
// Use instances of prsn
// free when finished
free(prsn);
}
Đối với VLA, các thể hiện được tạo phải có phạm vi cục bộ. Vì vậy, bên trong một chức năng ở đâu đó, hãy làm điều này:
int someFunction(int sizeOfStruct)
{
struct Person newPerson[sizeOfStruct] = {0};
Lưu ý phương pháp này không yêu cầu giải phóng bộ nhớ liên quan đến newPerson
20
phần tử loạistruct Person