10

Khi chúng ta tạo một biến và không khởi tạo nó, sau đó một số (ngẫu nhiên) số gọi là giá trị rác được gán cho nó.Biến không được định trước nhận giá trị rác như thế nào?

  • Giá trị này được gán cho biến như thế nào?
  • Toàn bộ khái niệm/cơ chế đằng sau điều này là gì?
  • Điều này chỉ xảy ra trong C?
+0

Tôi sẽ là người cuối cùng lên án h câu hỏi kiểu omework, nhưng đây không phải là một chút _too_ rõ ràng? –

+4

@DrJokepu Nếu nó đã được rõ ràng với tôi, tôi sẽ không lãng phí thời gian của tôi vào nó. –

+0

@Ravi, câu trả lời dĩ nhiên là không rõ ràng. Ý tôi là, điều này trông giống như một tập hợp các câu hỏi từ một bài tập ở trường với tôi. Đó là bởi vì các câu hỏi được xây dựng theo cách tạo ấn tượng rằng người hỏi ban đầu biết câu trả lời cho câu hỏi của họ. –

Trả lời

26

Giá trị rác không phải là được chỉ định, thay vì giá trị đã có ở đó. Khi bạn phân bổ một biến bạn đang đặt một phần bộ nhớ - cho đến khi bạn ghi đè lên bộ nhớ đó sẽ chứa bất kỳ thông tin "ngẫu nhiên" nào đã có trước đó. Như một phép ẩn dụ, hãy nghĩ đến việc phân bổ một biến như mua một mảnh đất - cho đến khi bạn làm một cái gì đó với nó (như xây nhà) đất sẽ chỉ có bất cứ thùng rác nào đang ngồi ở đó (như một ngôi nhà đổ nát cũ) .

Một số ngôn ngữ sẽ tự động điền các biến mới được phân bổ bằng số không - điều này cần có thời gian để thực hiện. Trong nhiều ngôn ngữ "tự thực hiện" như C, hành vi phụ này không phải là bảo đảm (mặc dù trên một số bộ nhớ hệ thống bị xóa bất kể ngôn ngữ, ví dụ như biện pháp bảo mật)

+0

Ah! Đặt tốt hơn của tôi :). Tuyệt quá! Ví dụ: – vpram86

+1

Ví dụ: MSVC khởi tạo mọi thứ thành 0xcccccccc ở chế độ gỡ lỗi (đôi khi có thể hữu ích) –

+7

Tôi thích phép ẩn dụ "mảnh đất". +1 –

2

Khi chúng tôi tạo biến và không khởi tạo biến, thì không có gì xảy ra. Khi bạn đọc giá trị từ biến đó, bạn sẽ nhận được dữ liệu từ bộ nhớ có biến nằm ngay bây giờ. Nó có thể trông giống như rác/giá trị ngẫu nhiên chỉ vì các biến số are placed in memory with some degree of randomness.

2

Không ai gán rõ ràng giá trị lấy mẫu. Nếu bạn tạo một biến, chỉ vị trí của biến được xác định và không phải là giá trị của biến đó. Đó là lý do tại sao chúng tôi đang khởi tạo nó. Giá trị rác có thể đến từ một số hoạt động trước đó trên cùng một bộ nhớ bằng các quy trình cũ! Vì vậy, nó có thể giữ bất cứ điều gì. Tôi nghĩ nó chứa khá nhiều ngôn ngữ. Tôi không chắc về danh sách này! :)

6

Bộ nhớ được sử dụng và tái sử dụng tại các điểm khác nhau trong ứng dụng của bạn. Ví dụ, khi ngăn xếp cuộc gọi của ứng dụng của bạn phát triển và thu nhỏ cùng một vị trí trong bộ nhớ có thể bị ghi đè nhiều lần, nhiều lần. Điều cần ghi nhớ là một phần của bộ nhớ bị bỏ đi, nó không phải là zeroed out, vì vậy nếu bạn không chỉ định giá trị ban đầu mới cho địa điểm đó trong bộ nhớ khi bạn sử dụng lại nó, bạn sẽ nhận được giá trị "rác" cũ.

Một số languagesstructure implementations làm bộ nhớ khởi tạo mặc định khi được sử dụng. Những người khác thì không, vì vậy điều quan trọng là đọc kỹ tài liệu ngôn ngữ của bạn để biết những gì mong đợi.

1

tiêu chuẩn C nói:

thực hiện: kiểm tra chi tiết của một thực hiện tại địa chỉ: https://stackoverflow.com/a/36725211/895245 Tóm tắt:

  • địa phương: địa chỉ không bao giờ được ghi vào, vì vậy bất cứ có trước đây được sử dụng
  • toàn cầu: .bss
Các vấn đề liên quan