2010-06-25 46 views
9

Hi Gần đây tôi đã thấy rất nhiều mã trên trực tuyến (cũng trên SO;) như:Phân bổ mảng char sử dụng malloc

char *p = malloc(sizeof(char) * (len + 1)); 

Tại sao sizeof (char)? Nó không cần thiết phải không? Hay nó chỉ là vấn đề về phong cách? Lợi ích của nó là gì?

+1

Bản sao của http://stackoverflow.com/questions/1011806/is-it-necessary-to-multiply-by-sizeof-char-when -manipulating-memory mặc dù tôi không đồng ý với câu trả lời được chấp nhận ở đó (tôi thích bỏ qua sizeof (char)) – user85509

Trả lời

12

Vâng, đó là vấn đề về phong cách, bởi vì bạn mong đợi sizeof(char) luôn là một.

Mặt khác, rất thành ngữ khi sử dụng sizeof(foo) khi thực hiện malloc và quan trọng nhất là mã tự tạo tài liệu.

Cũng tốt hơn để bảo trì, có lẽ. Nếu bạn được chuyển từ char để wchar, bạn muốn chuyển sang

wchar *p = malloc(sizeof(wchar) * (len + 1)); 

mà không cần nhiều suy nghĩ. Trong khi chuyển đổi tuyên bố char *p = malloc( len + 1 ); sẽ yêu cầu nhiều suy nghĩ hơn. Đó là tất cả về việc giảm chi phí tinh thần.

Và như @Nyan gợi ý trong một chú thích, bạn cũng có thể làm

type *p = malloc(sizeof(*p) * (len + 1)); 

cho chuỗi zero-chấm dứt và

type *p = malloc(sizeof(*p) * len)); 

cho bộ đệm thông thường.

+0

Sau đó, tại sao không sử dụng type * p = malloc (sizeof (* type) * (len + 1)); ;) – Nyan

+3

Ồ tôi có nghĩa là sizeof (* p) – Nyan

+0

@Nyan: Chắc chắn, điều đó cũng hoạt động. Tôi chưa bao giờ thấy điều này trước đây, nhưng nếu tôi vẫn là một lập trình viên làm việc C tôi sẽ xem xét việc áp dụng đề xuất của bạn như là một thành ngữ .. mặc dù phần 'len + 1' chỉ dành cho các đối tượng giống như chuỗi. – brainjam

1

Nó phục vụ tự ghi lại hoạt động. Ngôn ngữ xác định một char là chính xác một byte. Nó không chỉ định số lượng bit nằm trong byte đó vì một số máy có các đơn vị địa chỉ tối thiểu 8, 12, 16, 19 hoặc 30 bit (hoặc nhiều hơn). Nhưng char luôn là một byte.

1

Đặc tả quy định rằng ký tự là 1 byte, do đó, nó là tùy chọn hoàn toàn. Cá nhân tôi luôn bao gồm sizeof cho mục đích nhất quán, nhưng không quan trọng

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