
Gửi bởi
INTP
^x2 ta nghĩ hiểu vậy cũng được rồi. Kỹ hơn nữa thì phải phân biệt chữ tĩnh và động...
mảng nằm trên stack thì có kích cỡ cố định và được xác định khi biên dịch, còn mảng trên heap thì thay đổi kích cỡ được, được xác định khi chạy chương trình. Chữ tĩnh trong mảng tĩnh này là nói về kích cỡ của mảng là tĩnh/cố định, còn chữ động trong mảng động là nói về kích cỡ của mảng là dao động/ko cố định.
----------------
phân biệt với biến "tĩnh" và biến "động", chữ tĩnh / động này là nói về địa chỉ của biến đó cố định / dao động.
Biến local, hay biến nằm trong thân hàm, hay biến "động" thì có 2 loại 1 loại nằm trên stack 1 loại nằm trên heap. Biến từ malloc thì nằm trên heap, còn lại trên stack hết.
Biến "tĩnh" có 2 loại: 1 là global, tức là ko nằm trong thân hàm, 2 là biến nằm trong thân hàm/lớp/v.v.. nhưng có keyword static.
"tĩnh" ở đây là khai báo 1 lần và tồn tại đến hết chương trình, ko xóa bỏ/giải phóng khi chương trình đang chạy được. "động" là xuất hiện/biến mất liên tục. Vì xuất hiện/biến mất liên tục nên có địa chỉ ko cố định. Biến được đẩy lên stack thì tự động giải phóng, còn biến được đẩy lên heap (malloc) thì ko tự động giải phóng.
Vd:
void f() { int a[10]; } thì a là biến "động" nằm trên stack. Mỗi lần gọi f() thì a lại được đẩy lên stack rồi lấy khỏi stack. Tùy vào stack vơi hay đầy mà địa chỉ của a khác nhau.
void f() { static int a[10]; } thì a là biến "tĩnh" nằm trên vùng bss. a được đẩy lên vùng bss khi chương trình bắt đầu chạy. Mỗi lần gọi f() thì a vẫn là cái mảng trên bss đó, ko thay đổi. Khi kết thúc chương trình thì a mới được giải phóng (tự động)
void f() { int* a = (int*)malloc(sizeof(int)*10); free(a); } thì a là biến "động" nằm trên stack, còn mảng mà a trỏ tới là biến "động" nằm trên heap.
void f() { static int* a = NULL; a = (int*)malloc(sizeof(int)*10); free(a); } thì a là biến "tĩnh" nằm trên vùng data, còn mảng mà a trỏ tới là biến "động" nằm trên heap. Khi gọi f() nhiều lần thì địa chỉ của a ko đổi, nhưng địa chỉ mà a trỏ tới thì thay đổi.
int a[10]; int main() {} thì a là biến "tĩnh" nằm trên vùng bss.
int* a = (int*)malloc(sizeof(int)*10); int main() { free(a); } thì a là biến "tĩnh" nằm trên vùng data, còn mảng mà a trỏ tới là biến "động" nằm trên heap.
char a[10] = "123456789"; int main() {} thì a và "123456789" là biến "tĩnh" nằm trên vùng data, cụ thể hơn nữa là cả 2 đều nằm trên vùng read-only. Ở đây a là mảng.
const char* a = "123456789"; int main() {} thì a và "123456789" là biến "tĩnh" nằm trên vùng data, cụ thể hơn nữa là a nằm trên vùng read/write, còn "123456789" nằm trên vùng read-only. Ở đây a là con trỏ, ko phải là mảng.
int main() { char* a = "123"; } thì a là biến "động" nằm trên stack, còn "123" là chuỗi nằm trên vùng code/text, là hằng số, ko thay đổi được. Nếu gán a[0] = '0'; thì sẽ gây lỗi vì cố tình chép đè lên vùng code chỉ để đọc.
(vùng data/bss là chứa biến global/static, data thì chứa biến được khởi tạo sẵn, còn bss thì chứa biến ko được khởi tạo)
(vùng text là vùng chứa các câu lệnh và một số hằng số)
[/b] Tại Lương Sơn TV bạn sở hữu thể xem truyền hình trực tiếp bóng đá hôm nay các giải đấu to trong và ngoài nước. Lương Sơn TV ko chỉ đem lại những trận chiến mãn nhãn sở hữu chất lượng hình ảnh...
Các giải đấu không thể bỏ lỡ tại...