Variable Length Arrays là một phần của ngôn ngữ C kể từ C99. Nhưng chúng đã được tạo thành một tính năng trong C11 - có nghĩa là việc triển khai tuân thủ C11 không cần cung cấp (mặc dù, thực tế tất cả việc triển khai hỗ trợ C99 đều cung cấp VLA trong C11).
Bạn có thể kiểm tra xem bạn triển khai không cung cấp VLA bằng cách sử dụng macro __STDC_NO_VLA__
(Nếu được xác định trong chế độ C99 hoặc C11, thì việc triển khai của bạn không hỗ trợ VLAs).
Vì vậy, quyết định một kích thước mảng trong thời gian chạy là có thể trong C hiện đại (> = C99) và mã như dưới đây là tốt:
int s;
printf("Enter the array size: ");
scanf("%d", &s);
int a[s];
Một nhược điểm rõ ràng của Vlas là nếu s
là khá lớn và phân bổ a
không thành công. Tệ hơn nữa, không có cách nào để kiểm tra xem phân bổ đã thất bại hay chưa và bạn sẽ gặp phải lỗi thời gian chạy (ví dụ: segfault). Về cơ bản nó là undefined behaviour. Vì vậy, bạn muốn tránh VLAs nếu kích thước mảng quá lớn. Về cơ bản, khi nghi ngờ, hãy phân bổ bộ nhớ động (xem bên dưới).
Một vấn đề khác, ít nghiêm trọng hơn nhiều so với các vấn đề khác, với VLA là chúng có thời lượng lưu trữ tự động tự động (còn gọi là "ngăn xếp được phân bổ"). Vì vậy, nếu bạn muốn cái gì đó kéo dài trong thời gian dài hơn thì phạm vi khối nơi VLA được khai báo, sau đó VLA không có sự trợ giúp.
Trong C89, không có VLA. Vì vậy, việc sử dụng phân bổ bộ nhớ động là cách duy nhất. Mặc dù, có một số tiện ích mở rộng không chuẩn như alloca()
tương tự như VLA và có cùng hạn chế như VLA).
int s;
printf("enter the array size: ");
scanf("%d",&s);
int *a = malloc(s * sizeof *a);
...
free(a);
Ồ tôi hiểu rồi. cảm ơn bạn. vì vậy tất cả các phần tử của mảng vẫn nằm trên stack? – root
Có, họ đang có. Nếu đó là xấu, sử dụng malloc như đề xuất trong câu trả lời khác. –