2012-03-04 48 views
5

Mã của tôi là như dưới đây:C++ vấn đề phân bổ bộ nhớ

#include <string.h> 
int main() 
{ 
    int ii = 123; 
    char str[7] = ""; 
    strcpy(str,"123456"); 
    return 0; 
} 

tôi chạy này trong VS2010, bộ nhớ là như dưới đây

enter image description here

Tôi tò mò những gì cc trong bộ nhớ sử dụng cho? Và số lượng cc được tính như thế nào?

Trả lời

7

Khi biên dịch cho "Gỡ lỗi" trong Visual Studio, cc thường được sử dụng để lấp đầy bộ nhớ chưa được khởi tạo. Bằng cách đó, nó rõ ràng hơn khi bạn truy cập bộ nhớ chưa được khởi tạo.

Ví dụ, nếu bạn cố gắng dereference một con trỏ chưa được khởi tạo, bạn có thể sẽ có được một cái gì đó như:

Access Violation accessing 0xcccccccc 

hoặc một cái gì đó như thế.

enter image description here

+7

Và tại sao MS chọn '0xCC' làm giá trị điền? Bởi vì '0xCC' là lệnh breakpoint một byte trong tập lệnh x86. Bằng cách đó, nếu bạn vô tình thực hiện bộ nhớ không được lấp đầy, nó sẽ đạt đến điểm ngắt ngay lập tức. –

+0

@Rob Điều đó tôi không biết. :) Tôi cho rằng nó ít liên quan hơn đến mức chúng ta có bảo vệ bộ nhớ? – Mysticial

+2

@Mysticial: không thực sự: chỉ hoạt động ở cấp độ trang (toàn bộ trang có thể được đánh dấu là có thể thực thi được hay không, và chỉ khi CPU, HĐH và quy trình đồng ý bật NX-bit). Nhưng nếu bạn sử dụng 40 byte mã trong một trang 2KB thì sao? Trang phải được đánh dấu là có thể thực thi được, phần còn lại của trang có thể chạy được, nhưng chứa rác :) – jalf

1

Khi bạn truy cập vào không gian bộ nhớ uninitialised, VC2010 sẽ luôn luôn cảnh báo bạn rằng bạn đã truy cập một số địa chỉ có chứa 0xcccccccc,

0xcc là giá trị sử dụng bởi trình biên dịch (trong một debug xây dựng) để điền vào bộ nhớ chưa được khởi tạo.

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