Biến toàn cục (global) và biến static được khởi tạo mặc định về 0 vì:
- Đây là yêu cầu của chuẩn C/C++.
- Việc gán 0 tại compile-time là "miễn phí" (zero-cost) – linker chỉ cần cấp phát vùng nhớ BSS và hệ điều hành sẽ zero-fill khi load.
- Cả hai loại biến sinh ra object code giống nhau (đều nằm trong data segment).
Chúng được cấp phát trong section .bss (Block Started by Symbol). Khi nạp chương trình, hệ điều hành cấp bộ nhớ và tự động fill bằng 0.
Ví dụ
#include <stdio.h>
int a; // Global
static int b; // Global static
int main() {
int x; // Local (không khởi tạo -> giá trị rác)
static int y; // Local static (mặc định = 0)
int z = 28; // Local có khởi tạo
printf("Global a: %d\n", a);
printf("Global static b: %d\n", b);
printf("Local x (uninit): %d\n", x); // Giá trị không xác định
printf("Local static y: %d\n", y); // 0
printf("Local z = 28: %d\n", z); // 28
return 0;
}
Kết quả (typical)
Global a: 0
Global static b: 0
Local x (uninit): 32767 (giá trị rác, không xác định)
Local static y: 0
Local z = 28: 28
Lưu ý quan trọng: Chỉ biến global, static (cả global và local static) mới được zero-initialized tự động. Biến local thường (automatic) không được khởi tạo mặc định – giá trị của chúng là indeterminate (rác).