2011-12-20 28 views
6

Tôi đã xem qua đoạn mã sau:Những bảo đảm nào mà malloc thực hiện về căn chỉnh bộ nhớ?

int main() 
{ 
    char *A=(char *)malloc(20); 
    char *B=(char *)malloc(10); 
    char *C=(char *)malloc(10); 
    printf("\n%d",A); 
    printf("\t%d",B); 
    printf("\t%d\n",C); 
    return 0; 
} 
//output-- 152928264  152928288 152928304 

Tôi muốn biết làm thế nào việc phân bổ và đệm được thực hiện bằng malloc(). Nhìn vào đầu ra tôi có thể thấy rằng địa chỉ bắt đầu là bội số của 8. Bất kỳ quy tắc nào khác?

+2

Bất kỳ "quy tắc" nào bạn "tìm hiểu" bằng cách nghiên cứu những gì malloc thực hiện trên máy tính của bạn ... sẽ không được thực hiện ngay khi bạn chuyển sang máy tính khác hoặc thay đổi tùy chọn trình biên dịch hoặc giai đoạn thay đổi mặt trăng. .., ... :) – pmg

+3

Để in một con trỏ, bạn thực sự nên sử dụng '"% p "' và truyền tới 'void *': 'printf ("% p ", (void *) A); ' – pmg

+0

i dont thực sự hiểu câu hỏi của bạn. –

Trả lời

8

Accdording để this documentation page,

địa chỉ của một khối được trả về bởi malloc hoặc realloc trong hệ thống GNU luôn một bội số của tám (hoặc mười sáu trên hệ thống 64-bit).

Nói chung, malloc triển khai cụ thể cho từng hệ thống. Tất cả đều giữ một số bộ nhớ cho sổ sách kế toán của riêng mình (ví dụ: độ dài thực tế của khối được phân bổ) để có thể giải phóng bộ nhớ đó một cách chính xác khi bạn gọi free. Nếu bạn cần căn chỉnh với một ranh giới cụ thể, hãy sử dụng các chức năng khác, chẳng hạn như posix_memalign.

4

Quy tắc tiêu chuẩn duy nhất là địa chỉ được trả về bởi malloc sẽ được căn chỉnh phù hợp để lưu trữ bất kỳ loại biến nào. Chính xác điều đó có nghĩa là nền tảng cụ thể (kể từ khi yêu cầu liên kết khác nhau từ nền tảng đến nền tảng).

0

Đối với hệ thống Linux 32 bit:
Khi malloc() cấp phát bộ nhớ, nó cấp phát bộ nhớ theo bội số của 8 (đệm 8) và phân bổ thêm 8 byte cho sổ kế toán.

Ví dụ:

malloc (10) và malloc (12) sẽ phân bổ bộ nhớ 24 Bytes (16 Bytes sau khi đệm + 8 Byte cho kế toán).

malloc() làm đệm vì địa chỉ được trả về sẽ là bội số của tám và do đó sẽ hợp lệ cho con trỏ thuộc bất kỳ loại nào. Sổ sách kế toán 8 byte được sử dụng khi chúng tôi gọi chức năng miễn phí. Bookkeeping byte lưu trữ chiều dài của bộ nhớ được cấp phát.

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