Điều quan trọng là phải có định nghĩa rõ ràng về ý nghĩa của các thuật ngữ. Thật không may, dường như có nhiều định nghĩa về ý nghĩa của mảng tĩnh và mảng động.
Biến tĩnh là các biến được định nghĩa bằng cách sử dụng cấp phát bộ nhớ tĩnh . Đây là một khái niệm chung độc lập với C / C ++. Trong C / C ++, chúng ta có thể tạo các biến tĩnh với phạm vi toàn cục, tệp hoặc cục bộ như sau:
int x[10];
static int y[10];
foo() {
static int z[10];
Các biến tự động thường được thực hiện bằng cách sử dụng cấp phát bộ nhớ dựa trên ngăn xếp . Một mảng tự động có thể được tạo trong C / C ++ như sau:
foo() {
int w[10];
Có gì các mảng, x, y, z
và w
có điểm chung là kích thước cho mỗi người trong số họ là cố định và được xác định tại thời gian biên dịch.
Một trong những lý do quan trọng để hiểu sự khác biệt giữa mảng tự động và mảng tĩnh là lưu trữ tĩnh thường được triển khai trong phần dữ liệu (hoặc phần BSS ) của tệp đối tượng và trình biên dịch có thể sử dụng địa chỉ tuyệt đối để truy cập các mảng. điều này là không thể với lưu trữ dựa trên ngăn xếp.
Điều thường có nghĩa là một mảng động không phải là một mảng có thể thay đổi kích thước mà là một mảng được triển khai bằng cách sử dụng cấp phát bộ nhớ động với kích thước cố định được xác định tại thời điểm chạy. Trong C ++, điều này được thực hiện bằng cách sử dụng new
toán tử .
foo() {
int *d = new int[n];
Nhưng có thể tạo một mảng tự động với kích thước các bản sửa lỗi được xác định trong thời gian chạy bằng cách sử dụng alloca
:
foo() {
int *s = (int*)alloca(n*sizeof(int))
Đối với một mảng động thực sự, người ta nên sử dụng một cái gì đó giống như std::vector
trong C ++ (hoặc một mảng có độ dài thay đổi trong C ).
Điều gì có nghĩa là cho nhiệm vụ trong câu hỏi của OP? Tôi nghĩ rõ ràng rằng những gì được muốn không phải là một mảng tĩnh hoặc tự động mà là một mảng sử dụng cấp phát bộ nhớ động bằng cách sử dụng new
toán tử hoặc một mảng có kích thước không cố định bằng ví dụ std::vector
.