2010-09-28 35 views
5

Tôi đang nghiên cứu bài kiểm tra của mình trong C và tôi đang đọc trong bản tóm tắt C mà tôi đã tải xuống từ một số trang web. Nó được viết rằng nó không được phép viết arr[i] trong đó i là một biến. Cách duy nhất để làm điều đó là với malloc.
Tuy nhiên, tôi đã viết đoạn code sau đây và nó biên dịch mà không cần cảnh báo và không có lỗi trên valgrind:Khai báo một mảng có biến kích thước không cố định

int index = 5; 
int a4[index]; 

a4[0] = 1; 
a4[1] = 2; 

int index2; 
scanf("%d",&index2); 
int a5[index2]; 
a5[0] = 1; 
a5[1] = 2; 

Vì vậy, sự thật đằng sau tờ khai mảng là gì? cảm ơn bạn!

+0

Cảnh báo: Tôi khuyên bạn không nên tin tưởng tóm tắt về C được tìm thấy trên Internet quá nhiều; Gần đây tôi đã dành rất nhiều thời gian xem xét C và C++ để chuẩn bị cho các cuộc phỏng vấn và thấy rằng hầu hết các "hướng dẫn nghiên cứu" trên Internet đều có thông tin không chính xác hoặc gây hiểu lầm trong đó. Tôi khuyên bạn nên [một cuốn sách giới thiệu tốt] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list), với báo trước rằng những cuốn sách đó thường không bao gồm C99 các tính năng vì chúng ít được triển khai phổ biến hơn. –

+1

Mặc dù chúng hợp pháp trong C99, VLA là * cực kỳ * nguy hiểm trừ khi bạn đã có một giới hạn rất nhỏ về giá trị của biểu thức được sử dụng làm kích thước mảng. Họ có thể dễ dàng dẫn đến tràn ngăn xếp (không phải là loại tốt :-) và clobbering bộ nhớ heap. –

Trả lời

14

C99 cho phép variable length arrays được tạo trên ngăn xếp. Trình biên dịch của bạn có thể hỗ trợ tính năng này. Tính năng này không khả dụng ở C89.

Bản tóm tắt nói với bạn là đúng, từ một quan điểm nhất định. :-)

+0

Các mảng chiều dài biến làm cho tôi cảm thấy bối rối lúc đầu tiên bởi vì tôi nhớ nó không được hỗ trợ khi tôi được sử dụng để tìm hiểu C bằng cách sử dụng VC6.0. Chỉ bây giờ tôi thấy nó được sử dụng trên mã ví dụ của InsertionSort trên Hackerrank.com. Bây giờ nó rõ ràng. Hackerrank sử dụng gcc4.7.3, Chế độ C99, vì vậy tính năng này hoàn toàn được hỗ trợ. – ChandlerQ

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