Vì một lý do nào đó, tôi muốn quay tay phiên bản số không malloc()
. Để giảm thiểu độ phức tạp về thuật toán, tôi muốn viết:Có thể gọi memset() với một con trỏ null nếu kích thước là 0 không?
void * my_calloc(size_t size)
{
return memset(malloc(size), 0, size);
}
Điều này có được xác định rõ khi size == 0
? Nó là tốt để gọi malloc()
với một kích thước bằng không, nhưng điều đó cho phép nó trả về một con trỏ null. Liệu lệnh gọi tiếp theo là memset
có được chấp nhận hay là hành vi không xác định này và tôi cần phải thêm một điều kiện if (size)
?
Tôi rất muốn tránh kiểm tra dự phòng có điều kiện!
Giả sử thời điểm malloc()
không thành công. Trong thực tế, sẽ có phiên bản có tay của malloc()
ở đó, quá, sẽ chấm dứt khi không thành công.
Something như thế này:
void * my_malloc(size_t size)
{
void * const p = malloc(size);
if (p || 0 == size) return p;
terminate();
}
'memset' AFAIK không bắt buộc phải kiểm tra NULL, vì vậy nếu 'malloc' thất bại, bạn sẽ không có' byte' byte bắt đầu từ địa chỉ 0. – Praetorian
@Praetorian: Xin lỗi, tôi đã thêm sau: Giả sử rằng ' malloc() 'không bao giờ thất bại. Câu hỏi là chỉ khi 'size' có thể là' 0'. –