2012-04-28 19 views
6

Tôi có thể phân bổ địa chỉ bộ nhớ cụ thể bằng con trỏ trong C++ không?Tôi có thể phân bổ địa chỉ bộ nhớ cụ thể bằng con trỏ trong C++ không?

Ví dụ: Phân bổ Địa chỉ bộ nhớ này 25D4C3FA và đặt 4 trong đó.

+3

Tại sao bạn sẽ muốn làm điều đó? (Bạn đang ở trong một môi trường không có bộ nhớ ảo?) – Mat

+1

Vâng, và nếu địa chỉ đó đã được sử dụng thì sao? –

+3

Điều này hoàn toàn cụ thể cho từng nền tảng, vì vậy bạn nên chỉ định nền tảng nào bạn đang nhắm mục tiêu và lý do bạn cần thực hiện điều đó. –

Trả lời

17

Phân bổ một địa chỉ cụ thể trong không gian địa chỉ của quy trình của bạn hơi phức tạp và cụ thể cho từng nền tảng. Trên các hệ thống Unix, mmap() có lẽ là gần nhất bạn sẽ nhận được. Tương đương Windows là VirtualAlloc(). Có, tất nhiên, không có bảo đảm vì địa chỉ có thể đã được sử dụng.

Viết đến một địa chỉ cụ thể là tầm thường:

char *p = (char*)0x25D4C3FA; 
*p = 4; 

Tôi giả sử bạn có lý do chính đáng để muốn làm điều đó.

+4

Đó là giá trị thêm rằng trên Windows, một trong những sẽ muốn gọi 'VirtualAlloc'. – Fanael

+0

@Fanael: Cảm ơn bạn đã đề xuất. Đã cập nhật câu trả lời. – NPE

+0

Bạn có thể cho tôi một ví dụ về VirtualAlloc để phân bổ địa chỉ này 25D4C3FA – faressoft

0

Giả sử rằng bằng cách phân bổ bạn thực sự có nghĩa truy cập,

Bạn có thể, nhưng nếu địa chỉ không hợp lệ hoặc không thể truy cập sau đó Truy cập vào địa chỉ này sẽ dẫn đến hành vi undefined.
Vì vậy, bạn không nên làm như vậy.

+0

Không, trong tiêu chuẩn C++ bạn không thể. Bạn có thể đặt con trỏ thành 0x25f4c3fa và cố gắng sử dụng nó, nhưng đây không phải là "phân bổ". –

+0

@MatteoItalia: OP có nghĩa là đặt con trỏ thay vì phân bổ ở đây nếu bạn đọc q đầy đủ. –

+5

Câu hỏi là khá mơ hồ, nhưng ông cụ thể nói "phân bổ" nhiều lần. –

0

Bạn có thể yêu cầu một địa chỉ cụ thể thông qua VirtualAlloc trên Windows và tôi hy vọng các hệ điều hành khác cũng làm như vậy, nhưng không có đảm bảo và không có nền tảng độc lập.

2

Trong Windows, có.

pseudo-code:

Pointer desiredAddress = 0xD0000000; 

//allocate 1 KB at our desired address 
Pointer p = VirtualAlloc(desiredAddress, 1024, 
     MEM_COMMIT | MEM_RESERVE, 
     PAGE_READWRITE); 
Các vấn đề liên quan