Bài 27 Bộ nhớ stack

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 69 - 71)

/ *t ạo nút mới và copy dữ liệu *

Bài 27 Bộ nhớ stack

Tóm tắt nội dung:

Các biến cục bộ và tham số hàm được cấp phát trên bộ nhớ stack cho mỗi lần gọi hàm. Chúng khơng cịn xác định do đã bị giải phóng mỗi khi hàm kết thúc. Do vậy sẽ là không hợp lệ nếu kết quả của hàm là con trỏ đến một vùng nhớ stack.

Một câu hỏi có thể được đặt ra là tại các biến được truyền vào cho các tham số hình thức của hàm sẽ không bi thay đổi mặc dù trong nội dung hàm có thay đổi các tham số này. Để trả lời được câu hỏi này yêu cầu người lập trình cần có hiểu biết về cơ chế hoạt động của chương trình khi một hàm được gọi.

Trên thực tế các biến cục bộ của một hàm không phải ln sẵn có trên bộ nhớ chương trình với lí do các biến này chỉ được sử dụng đến khi hàm chạy. Vì thế chỉ khi nào hàm được gọi các biến của nó mới được tự động cấp phát bộ nhớ. Cịn khi hàm kết thúc thì bộ nhớ của các biến này sẽ được giải phóng. Có một bộ nhớ chuyên dụng dành cho công việc này được gọi là bộ nhớ stack. Ngoài các biến cục bộ của hàm thì các các ơ nhớ dành cho tham số của hàm cũng được cấp phát trên bộ nhớ stack. Dựa trên ngun lí này chúng ta có thể giải thích tại sao các biến truyền theo tham số hình thức vào cho hàm sẽ khơng bao giờ bị thay đổi giá trị.

Ví dụ:

void swap(int a, int b) { int tmp = a; a = b; b = tmp; } void main() { int x=5, y=6;

swap(x, y); /* kết thúc lời gọi hàm x, y giữ nguyên giá trị */ }

Trong ví dụ trên, hai biến x, y được truyền vào cho lời gọi hàm swap(). Khi hàm này được gọi chương trình tự động cấp phát bộ nhớ trên stack cho các tham số a, b và biến cục bộ của hàm (hình vẽ 8). Tham số a và b nhận giá trị của biến x, y truyền vào cho lời gọi hàm. Các câu lệnh của hàm swap() chỉ làm thay đổi giá trị các tham số a, b trên bộ nhớ swap mà hồn tồn khơng tác động gì đến biến x và y. Điều này dẫn đến khi hàm thực hiện xong, các tham số a, b và biến cục bộ được giải phóng, giá trị của các biến x, y vẫn được giữ nguyên.

B? nh? stack

Truy?n giá tr? int a

int b 6 5 int tmp int x int y 5 6

Hình 8: Truyền giá trị cho tham số hình thức của hàm

Bộ nhớ chúng ta đang tìm hiểu khơng ngẫu nhiên mà có tên là stack. Nó lấy tên này chính là lí do tất cả các biến nhớ được cấp phát trên vùng nhớ này đều tuân theo nguyên tắc biến nào được cấp phát sau sẽ được giải phóng trước. Ta xét một ví dụ.

void f() { int a; } void g() { int b; f();

}

void main() {

g();

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 69 - 71)