Cấp phát bộ nhớ :

Một phần của tài liệu Lập trình C (Trang 56 - 57)

VI. Các lệnh rẽ nhánh không điều kiện: break, continue, goto:

I.9.Cấp phát bộ nhớ :

Ch−¬ng VI HÀM, MẢNG VÀ CON TRỎ

I.9.Cấp phát bộ nhớ :

Biến toàn cục được cấp phát bộ nhớ tĩnh nên gọi là biến tĩnh và cấp phát tĩnh. Biến địa phương có các loại :

• Cấp phát động : khi kết thúc hàm biến được giải phóng, không lưu kết quả cho lần sau. • Cấp phát tĩnh : khi kết thúc hàm không giải phóng biến, lưu kết quả cho lần sau ( dùng từ khóa static trước dòng khai báo) .

Các biến địa phương được ngầm định là cấp phát động. Nếu thích, ta có thể thêm vào từ khóa auto vào đầu dòng khai báo : auto int x; Các biến auto được cấp phát ở stack.

Ví dụ : sự khác nhau giữa biến cấp phát động và biến cấp phát tĩnh. #include <stdio.h> #include <conio.h> void ham(void); main() { int dem; for(dem=0;dem<=3;dem++)

{ printf(“\nLan goi thu %d”,dem); ham(); } getch(); return 0; } void ham(void)

{ static int x; // có thể thay bằng static int x=0; int y=0;

printf(“ x = %d , y = %d “,x++,y++); }

Kết quả :

Lan goi thu 0 : x = 0 , y = 0 Lan goi thu 1 : x = 1 , y = 0 Lan goi thu 2 : x = 2 , y = 0 Lan goi thu 3 : x = 3 , y = 0

Câu lệnh static int x; chỉ được thực hiện khi biên dịch, khi ham() được gọi lần đầu tiên nó cũng không được thực hiện. Câu lệnh int y=0 luôn được thực hiện mỗi khi gọi hàm.

Và theo ví dụ trên ta thấy các biến địa phương tĩnh được khởi tạo giá trị đầu bằng 0 khi dùng lần đầu (nếu ta không khởi tạo).

Nếu chương trình được viết trên nhiều file và biến a được khai báo ở ngoài các hàm như sau: static int a; thì biến a chỉ được biết đến trong modul hiện tại, không được biết đến trong các modul khác.

• Biến địa phương thanh ghi : register int x;

Dùng để yêu cầu trình biên dịch nếu có thể thì đặt biến đó vào thanh ghi thay vì đặt vào một ô nhớ thông thường. Khi đó ta có thể truy xuất đến biến này rất nhanh chóng. Ta thường sử dụng cách khai báo này với các biến đếm của vòng lặp. Nếu trình biên dịch không thể cấp phát ở register thì biến đó là auto.

Từ khóa register không được dùng với các biến tĩnh hay biến ngoài. Ta không thể định nghĩa một con trỏ tới biến thanh ghi.

Một phần của tài liệu Lập trình C (Trang 56 - 57)