2011-01-18 37 views
5

Biến tĩnh khi được khai báo trong tệp không thể truy cập được từ bên ngoài tệp. Nhưng nếu chúng ta khai báo một biến tĩnh bên trong một tệp và một con trỏ toàn cầu và sau đó gán địa chỉ của biến tĩnh cho con trỏ và sau đó externing con trỏ, nó có thể được truy cập.biến tĩnh trong c

Vì vậy, có đúng là các biến tĩnh không thể được truy cập trực tiếp nhưng nó có thể được truy cập gián tiếp bằng cách sử dụng con trỏ toàn cầu và sau đó externing?

+1

Câu hỏi phải ở trong stackoverflow vì đó là về lập trình – Mark

+0

+1 cho câu hỏi này.Không bao giờ nghĩ về nó :) – hari

+2

Bạn thậm chí không cần một con trỏ 'extern' để" truy cập "biến. Một con trỏ tới biến cũng có thể được trả về từ một hàm, hoặc được gán cho một con trỏ trỏ tới con trỏ. – aschepler

Trả lời

1

Mọi thứ trong một quy trình có thể được truy cập nếu bạn có con trỏ đến nó, chặn các cơ chế kiến ​​trúc cụ thể để hạn chế quyền truy cập.Redundantly nói rằng một biến có thể được truy cập thông qua một con trỏ thừa.

10

Không đúng khi nói rằng các biến tĩnh "không thể truy cập được" từ bên ngoài. Bị tuyên bố static hoàn toàn không liên quan gì tới khả năng truy cập bên ngoài.

Khi một số thực thể được khai báo static, điều này chỉ có nghĩa là pháp nhân này sẽ không được liên kết với các pháp nhân khác cùng tên trong các đơn vị dịch thuật khác.

Ví dụ: khi bạn khai báo hai tên extern biến tên a trong các đơn vị dịch khác nhau, các biến này thực tế là cùng một biến duy nhất. Khi bạn khai báo hai biến số static có tên là a trong các đơn vị dịch khác nhau, các biến này là hai biến độc lập khác nhau. Đây là những gì static làm trong C. Không có gì khác.

Phát biểu về hàng ngày hơn, nó không thể liên kết để biến tĩnh từ bên ngoài, tức là nó không thể hỏi mối liên kết để cho chúng tôi truy cập vào tĩnh biến theo tên từ bên ngoài. Tuy nhiên, nó luôn luôn có thể truy cập nó theo một cách khác, như thông qua một con trỏ, giả sử rằng bạn quản lý để có được con trỏ đó bằng cách nào đó.

+0

Không có gì khác ... ngoại trừ khởi tạo biến thành 0. +1 dù sao – SiegeX

+3

@SiegeX: Tất cả các đối tượng có * thời gian lưu trữ tĩnh * được khởi tạo thành 0. Nhưng để có thời gian lưu trữ tĩnh đối tượng không nhất thiết phải được khai báo 'tĩnh'. Nói cách khác, 0 khởi tạo không liên quan ngay đến từ khóa 'tĩnh'. 0 khởi tạo là kết quả của thời gian lưu trữ * cụ thể *. Câu hỏi (cách tôi nhìn thấy nó) thực sự là về * liên kết *. – AnT

0

Biến không thể truy cập được và sẽ không có tên xung đột với tên biến này và không ai có thể tìm thấy biểu tượng của biến này.

Nhưng tất nhiên bạn luôn có thể truy cập thông qua con trỏ. Toàn bộ bộ nhớ (stack + heap) của quá trình có thể được truy cập thông qua con trỏ và không có cách nào để ngăn chặn điều đó.

Sử dụng biến tĩnh không phải là bảo mật để ngăn truy cập vào nó từ bên ngoài mô-đun.

2

Từ khóa tĩnh trong 'C' chỉ giới hạn phạm vi của biến đối với đơn vị dịch cụ thể đó (nghĩa là tệp 'C'.) .Trong các từ khác, nó hạn chế liên kết của biến đó.và không có gì khác.và Trong C tất cả các biến tĩnh, toàn cầu và tự động có thể được truy cập thông qua con trỏ trong suốt cuộc đời của chúng.không phải là cách để ngăn chặn điều đó.

6

Hãy suy nghĩ về tên biến của liên kết tĩnh và bên ngoài dưới dạng địa chỉ như "nhà của người điên" và "đường 123 foo", tương ứng. Cái cũ chỉ có ý nghĩa với những người biết bạn, trong khi cái sau có ý nghĩa với người khác cũng như do một quy ước đã được thiết lập. Nhưng ngay cả khi "nhà của người điên" không có địa chỉ đường phố, nó vẫn có vĩ độ và kinh độ mà bạn có thể trao cho ai đó muốn bắn tên lửa vào nó. :-)