2012-10-24 14 views
7

Có bất kỳ cạm bẫy nào khi sử dụng char * để viết mã nền tảng chéo có truy cập bộ nhớ không?Bất kỳ cạm bẫy nào sử dụng char * thay vì void * khi viết mã nền tảng chéo?

CẬP NHẬT: Ví dụ: tôi có nên kiểm tra trước khi truyền một ký tự dereferenced char * vào một loại nhất định (giả sử int) nếu địa chỉ được căn chỉnh theo kích thước của loại đó không? Một số kiến ​​trúc nhất định có trả về kết quả lạ trên truy cập không được ký hiệu không?

Tôi đang làm việc trên bộ cấp phát bộ nhớ phát để hiểu rõ hơn cách gỡ lỗi các vấn đề về memmory. Tôi đã đến để tin char * 's là thích hợp hơn vì khả năng làm số học con trỏ và dereference chúng trên void *' s, đó là sự thật? Các giả định sau đây có đúng với các nền tảng chung khác nhau không?

sizeof(char) == 1 
sizeof(char*) == sizeof(void*) 
sizeof(char*) == sizeof(size_t) 
+0

Trừ khi bạn đang dereferencing 'char' trường hợp bạn sẽ phải đúc cả hai' char * 'và' void * 'cho bất kỳ loại họ trỏ đến. – Aesthete

+0

Không biết nếu nó được 'bảo đảm' nhưng trong kinh nghiệm của tôi, đầu tiên 2 nên được an toàn. Cái cuối cùng...??. – vdbuilder

Trả lời

5

sizeof(char)==1 chắc chắn luôn đúng.

sizeof(char *) == sizeof(void *)có lẽ luôn luôn đúng. Tiêu chuẩn C yêu cầu chúng phải có cùng một biểu diễn, ít nhất nó ngụ ý cùng một kích thước.

sizeof(char *) == sizeof(size_t) chắc chắn không thể phụ thuộc vào - Tôi biết các triển khai mà nó sai (và trong khi chúng có thể không hoàn toàn phù hợp với tiêu chuẩn, đây không phải là một vấn đề của chúng).

+1

Cảm ơn Jerry. Bạn có biết một loại luôn có cùng kích thước với kích thước con trỏ (không phải kiểu con trỏ :))? Ví dụ, nó phải là 32 bit trên một 32 bit xây dựng và 64 trên một bản xây dựng 64 bit. Tôi đã được ấn tượng size_t là một loại như vậy. – UberMongoose

+1

@UberMongoose: đầu tiên, lưu ý rằng thậm chí không có yêu cầu mà tất cả các con trỏ đều có cùng kích thước. Họ thường sẽ được, nhưng nó không cần thiết. Trong hầu hết các trường hợp điển hình, 'size_t' sẽ giống nhau, nhưng một lần nữa, không được bảo đảm (và tôi biết ít nhất một vài ngoại lệ). MS (cho một ví dụ) định nghĩa một số loại như INT_PTR (một số nguyên có cùng kích thước với con trỏ), nhưng nó không phổ biến. Có lẽ điều tốt nhất bạn có thể làm là sử dụng typedef trong tiêu đề cấu hình, vì vậy bạn có thể sửa đổi nếu bạn đến một nền tảng mà bạn cần. –

+2

intptr_t? "Loại sau chỉ định loại số nguyên có dấu với thuộc tính mà bất kỳ con trỏ hợp lệ nào để trống có thể được chuyển đổi thành loại này, sau đó được chuyển trở lại con trỏ thành void và kết quả sẽ so sánh với con trỏ ban đầu" – rici