2012-03-18 49 views
16

Làm cách nào để lấy kích thước của con trỏ trong C bằng cách sử dụng sizeof? Tôi muốn malloc một số bộ nhớ để lưu trữ một con trỏ (không phải là giá trị được trỏ đến).Lấy kích thước con trỏ trong C

+5

AFAIK, con trỏ đến các loại khác nhau không được đảm bảo có cùng kích thước. – SLaks

+0

Thật sao? Bạn có thể cung cấp một ví dụ/nguồn không? Tôi đã luôn luôn giả định tất cả các con trỏ có cùng kích thước bởi vì tất cả chúng đều đề cập đến các vị trí bộ nhớ trong cùng một không gian địa chỉ. – Matt

+4

@Matt: Một counterexample tầm thường là một con trỏ hàm; đó không nhất thiết là cùng một không gian địa chỉ. Xem thêm: http://stackoverflow.com/questions/916051/are-there-are-any-platforms-where-pointers-to-different-types-have-different-siz. –

Trả lời

27

Với một kiểu bất kỳ (tôi đã chọn char đây, nhưng đó là vì lợi ích của ví dụ cụ thể):

char *p; 

Bạn có thể sử dụng một trong hai của các biểu thức sau:

sizeof(p) 
sizeof(char *) 

Dẫn đến malloc() cal l chẳng hạn như:

char **ppc = malloc(sizeof(char *)); 
char **ppc = malloc(sizeof(p)); 
char **ppc = malloc(sizeof(*ppc)); 

Phiên bản cuối cùng có một số lợi ích nếu loại ppc thay đổi, biểu thức vẫn phân bổ không gian chính xác.

+4

Dấu ngoặc đơn tùy chọn trong biểu thức đầu tiên. –

+3

@CarlNorum Đúng, nhưng tôi thấy họ làm rõ biểu hiện khá một chút. Đó là vấn đề về phong cách, và không phải là thứ cần chỉnh sửa. –

+2

+1 để xác định phiên bản cuối cùng được ưu tiên. –

11

này nên làm như lừa:

sizeof(void*) 
1
char *ptr; 
char **ptr2 = malloc(sizeof(ptr)); 

sẽ có thể đạt được mục đích của bạn. Bất kể nền tảng là gì, mã này sẽ hoạt động.

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