Biến Static trong C

Biến static có khả năng gì. Biến static nằm ở phân vùng nào trong bộ nhớ. Giá trị khởi tạo mặc định của biến static là gì. Hàm static là gì.

Biến tĩnh (static variable) trong C có thuộc tính là bảo toàn giá trị của nó ngay cả khi ở ngoài tầm vực (scope) của nó! Do đó, biến tĩnh bảo toàn giá trị trước đó của nó trong scope trước đó của nó và không bị khởi tạo lại trong scope mới.

Cú pháp:

static data_type var_name = var_value;

Sau đây là một số thông tin thú vị về các biến static trong C.

1) Một biến static int vẫn duy trì trong bộ nhớ khi chương trình đang chạy. Một biến bình thường (normal) hoặc tự động (auto) bị xóa khi một lệnh gọi hàm, mà biến được khai báo trong hàm đó, kết thúc.

Ví dụ: chúng ta có thể sử dụng một biến static int để đếm số lần một hàm được gọi, nhưng không thể sử dụng một biến auto cho việc này.

Chương trình ví dụ dưới đây in “1 2”

#include<stdio.h>
int fun()
{
  static int count = 0;
  count++;
  return count;
}
  
int main()
{
  printf("%d ", fun());
  printf("%d ", fun());
  return 0;
}

Kết quả:

1 2 

2) Biến static được cấp phát bộ nhớ trong data segment, không phải stack segment. Xem memory layout của chương trình C để biết thêm chi tiết.

3) Biến static (làm biến toàn cục) được khởi tạo bằng 0 nếu không được khởi tạo tường minh. Ví dụ trong chương trình dưới đây, giá trị của x được in là 0, trong khi giá trị của y là giá trị rác. Xem bài viết để biết thêm chi tiết.

#include <stdio.h>
int main()
{
	static int x;
	int y;
	printf("%d \n %d", x, y);
}

Kết quả:

0
[some_garbage_value]

4) Trong C, biến static chỉ có thể được khởi tạo bằng các ký tự hằng (constant literal). Ví dụ, chương trình sau báo lỗi trong quá trình biên dịch. Xem bài này để biết thêm chi tiết.

#include<stdio.h>
int initializer(void)
{
	return 50;
}

int main()
{
	static int i = initializer();
	printf(" value of i = %d", i);
	getchar();
	return 0;
}

Kết quả:

In function 'main':
9:5: error: initializer element is not constant
     static int i = initializer();

Hãy lưu ý rằng điều kiện này không áp dụng trong C++. Vì vậy, nếu bạn lưu dưới dạng chương trình C++, nó sẽ biên dịch và chạy tốt.

5) Các biến static và hàm static cũng có thể được sử dụng trong C/C++. Mục đích là giới hạn phạm vi (scope) của một biến hoặc hàm trong một file. Hãy tham khảo Static Function trong C để biết thêm chi tiết.

6) Không nên khai báo biến static bên trong một cấu trúc (structure). Lý do là trình biên dịch C yêu cầu toàn bộ các phần tử cấu trúc (structure element) phải được đặt cùng nhau, tức là việc cấp phát bộ nhớ cho các structure element phải kế tiếp nhau. Có thể khai báo (declare) cấu trúc bên trong hàm (stack segment) hoặc cấp phát bộ nhớ động (heap segment) hoặc thậm chí có thể là biến toàn cục (BSS hoặc data segment). Dù là trường hợp nào, tất cả structure element nên được bố trí trong cùng một memory segment vì giá trị của stucture element được lấy bằng cách đếm offset của element từ địa chỉ bắt đầu của cấu trúc. Việc tách riêng một element trong data segment sẽ làm mất đi mục đích của biến static và có thể khiến cho toàn bộ structure thành static.

Hãy để lại bình luận nếu bạn thấy bất kỳ điều gì không chính xác, hoặc bạn muốn chia sẻ thêm thông tin về chủ đề đã thảo luận ở trên.

Xem thêm các bài Dạy học Lập Trình C

Icons made by Freepik from www.flaticon.com