2013-09-03 26 views
6

Trong một chương trình C điển hình, cả biến tĩnh và biến toàn cục đều nằm trên phân đoạn dữ liệu. Tuy nhiên phạm vi của biến tĩnh được giới hạn trong tệp. Ngược lại, biến toàn cầu có thể được truy cập từ bất cứ đâu. Tại sao nó xảy ra, mặc dù cả hai đều nằm trong cùng một bộ nhớ?Biến tĩnh và biến toàn cục đều nằm trong phân đoạn dữ liệu. Tuy nhiên, biến tĩnh có phạm vi giới hạn. Tại sao?

+0

Đó là cách nó được xác định, quay ngược thời gian. Các nhà phát triển của C không muốn lãng phí một từ khóa mới trên "địa phương" hoặc "nonglobal" hoặc bất cứ điều gì, vì vậy họ tái chế "tĩnh". –

+1

Thuật ngữ "biến" không được xác định rõ ràng trong C. Thực tế, nó không được sử dụng chút nào trong văn bản quy phạm của phần "Ngôn ngữ". Có các đối tượng (vùng lưu trữ) và số nhận dạng (tên). Vấn đề ở đây là: một định danh có phạm vi và liên kết, một đối tượng có thời lượng lưu trữ. 'static' không thay đổi thời lượng lưu trữ của một đối tượng (đối với" biến toàn cầu "), nó chỉ thay đổi liên kết của mã định danh. – dyp

Trả lời

1
Why does it happen, although both resides in the same memory? 

câu trả lời ngắn gọn: -

Từ tiêu chuẩn C11 (6.2.2 Sự liên kết của định danh) para 4:

Nếu việc kê khai của một định phạm vi tập tin cho một đối tượng hoặc hàm chứa thông số kỹ thuật của bộ đếm storageclass tĩnh, số nhận dạng có liên kết nội bộ.

Liên kết nội bộ có nghĩa là chỉ hiển thị bên trong translational unit.

câu trả lời chi tiết:

Một biến toàn cầu (không tĩnh) có mối liên hệ bên ngoài có nghĩa là nó được hiển thị cho các đơn vị tịnh tiến khác.

Khi bạn khai báo biến tĩnh với phạm vi tệp có liên kết nội bộ nhưng khi bạn khai báo với phạm vi khối, nó không có liên kết.

Cho phép hiểu một vài thuật ngữ cụ thể.(Lấy cảm hứng từ C keywords (static))

biến AC có một trong các liên kết sau đây:

  • không liên kết: - biến với phạm vi khối không có linkage.It nghĩa là họ tin vào khối trong đó chúng được xác định. Tất cả các biến có thời lượng lưu trữ tự động, luồng và động đều có liên kết này, cũng như các biến được khai báo tĩnh ở phạm vi khối. Biến có phạm vi tệp có thể có liên kết nội bộ hoặc bên ngoài.
  • liên kết nội bộ: - Biến có thể được tham chiếu từ tất cả các phạm vi trong đơn vị dịch hiện tại. Tất cả các biến được khai báo ở phạm vi tệp đều có liên kết này, bao gồm các biến được khai báo tĩnh ở phạm vi tệp.
  • liên kết bên ngoài: - Biến có thể được tham chiếu từ bất kỳ đơn vị dịch nào khác trong toàn bộ chương trình. Tất cả các biến được khai báo hoặc là extern hoặc const không có bộ định danh lớp lưu trữ rõ ràng, nhưng không tĩnh, có liên kết này.

e.g-

int i = 5; // file scope, external linkage 
static int j = 3; // file scope, internal linkage 
... 
... 
int main() 
{ 
... 
... 
} 
int func() 
{ 
static int num;// block scope – no linkage 
. . . 
} 

Bằng cách khai báo một tĩnh biến trên mức tập tin (static trong chức năng có một ý nghĩa khác nhau), bạn cấm các đơn vị khác để truy cập vào nó, ví dụ nếu bạn cố gắng sử dụng biến bên trong một đơn vị khác (được khai báo với extern), trình liên kết sẽ không tìm thấy biểu tượng này.

Mỏ nhấn mạnh :)

2

Ý tưởng về biến tĩnh là chúng không toàn cầu và không 'gây ô nhiễm' không gian tên chung. Nó có nghĩa là tôi có thể sử dụng biến 'đếm' trong 5 chức năng khác nhau và chúng sẽ không đụng độ. Phạm vi hạn chế biến trong ngữ cảnh của chúng.

1

Về mặt kỹ thuật, bạn có thể truy cập mọi thứ. Trình biên dịch sẽ không cung cấp cho bạn địa chỉ bộ nhớ - bạn sẽ phải tự lấy nó. Bằng cách nào đó.

+0

Về mặt kỹ thuật, bạn có thể truy cập “mọi thứ” phụ thuộc vào việc triển khai hay không. Không phải tất cả các triển khai C đều sử dụng một mô hình bộ nhớ đơn giản, phẳng. Và, ngay cả trong các mô hình bộ nhớ đơn giản, không phải tất cả các đối tượng trong mô hình tính toán C tồn tại trong việc thực hiện cuối cùng sau khi tối ưu hóa. –

9

Theo thiết kế.

static ở phạm vi toàn cầu là từ khóa bạn sử dụng có nghĩa là "Tôi muốn các biến này bị giới hạn trong phạm vi; Tôi không muốn phải quan tâm những gì các mô-đun khác đã khai báo biến cùng tên." Lý do bằng cách sử dụng từ khóa này không một điều khác nhau để không sử dụng nó là trong thực tế chính xác lý do cho sự tồn tại của nó.

Lưu ý từ khóa có nghĩa là những thứ khác nhau trong các ngữ cảnh khác nhau; tại phạm vi chức năng static có nghĩa là "nội dung của biến này phải tồn tại giữa các cuộc gọi hàm".

Bố trí thực tế dữ liệu trong bộ nhớ kết quả là chi tiết triển khai và sẽ khác nhau giữa các trình biên dịch và nền tảng.

Các vấn đề liên quan