2015-04-22 20 views
5

Giả sử tôi có một C struct định nghĩa như sau:bố trí bộ nhớ của C struct với mảng

typedef struct 
{ 
    double array1[2]; 
} struct0_T; 

Làm thế nào là nhớ đặt ra? Cấu trúc có giữ chỉ là một con trỏ hay giá trị của hai đôi? Trước khi tôi nghĩ rằng cấu trúc giữ một con trỏ, nhưng hôm nay tôi phát hiện ra (ngạc nhiên của tôi) rằng các giá trị được lưu trữ ở đó. Nó có khác nhau giữa các trình biên dịch khác nhau không?

+3

Nó sẽ giữ giá trị. Và không, nó không khác nhau giữa các trình biên dịch. –

+1

Nếu nó chỉ giữ một con trỏ, dữ liệu sẽ ở đâu? –

+1

mảng không phải là con trỏ. Trong một số trường hợp, mảng phân rã thành con trỏ. Đây chắc chắn không phải là một trong những tình huống đó. – bolov

Trả lời

9

Cấu trúc chứa hai giá trị. Bố cục bộ nhớ là .array1[0], tiếp theo là .array1[1], được theo sau bởi một số lượng đệm.

Phần đệm là phần duy nhất của điều này có thể khác nhau giữa các trình biên dịch (mặc dù trong thực tế, với thành viên duy nhất của cấu trúc là mảng sẽ hầu như không có đệm).

Mặc dù bạn có thể đã nghe nói rằng một mảng trong C là một con trỏ, điều đó không đúng - một mảng là một loại tổng hợp bao gồm tất cả các đối tượng thành viên, giống như một cấu trúc. Nó chỉ là trong hầu hết các bối cảnh biểu thức, một mảng đánh giá thành một con trỏ tới thành viên đầu tiên của nó.

+1

Mảng không thể có byte đệm, cấu trúc có thể. – edmz

2

Tuyên bố cấu trúc trên chỉ thông báo cho trình biên dịch rằng các loại cấu trúc dữ liệu struct sẽ mất sizeof(struct0_T) byte bộ nhớ và bộ nhớ này sẽ được phân bổ khi biến đó thuộc loại đó được khởi tạo.

struct0_T s; 

Hiện tại, s chứa một mảng gồm hai doubles. Sẽ không có đệm trong trường hợp này.

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