2010-06-24 26 views

Trả lời

8

Nếu kích thước của không gian yêu cầu là 0, hành vi này là thực hiện xác định: giá trị trở về sẽ được một trong hai một null con trỏ hoặc con trỏ duy nhất.

Nguồn: malloc tại The Open Group

+0

+1 cho liên kết – neuro

2

Tôi đoán địa chỉ chỉ hợp lệ nếu bạn muốn sử dụng 0 byte từ nó. Việc sử dụng có lẽ sẽ không phải đặc biệt điều trị các trường hợp như:

char * foo = malloc(size); 
// do something with foo 
free(foo); 
+0

Vâng vâng, nhưng bạn phải xử lý giá trị trả về NULL và mọi lập trình viên phong nha sẽ có giá trị mạch lạc có kích thước tại thời điểm này hoặc sau ... – neuro

+1

Tuy nhiên, cũng an toàn khi chuyển 'NULL' đến ['miễn phí'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/free.html). –

2

Nó không trả về một địa chỉ hợp lệ.

Kết quả của malloc (0) được thực hiện được xác định và do đó không đáng tin cậy.

Một số triển khai trình biên dịch sẽ làm cho nó trả về con trỏ NULL, một số khác có thể trả về một số giá trị khác (nhưng vẫn không thể sử dụng để truy nhập bộ nhớ).

Không thể sử dụng bộ nhớ, (tuy nhiên nó có thể yêu cầu miễn phí() ing).

+0

Bạn có quyền thực hiện phụ thuộc nhưng malloc (0) trả về NULL hoặc một địa chỉ VALID (có nghĩa là bạn có thể gọi miễn phí trên nó mà không có segfault). Vì vậy, nó trả về một địa chỉ hợp lệ. Nhưng bạn có quyền nói rằng bạn không nên sử dụng nó. Dù sao cũng như bất kỳ lập trình viên nào cũng có mã kiểm tra kích thước chính xác, nó là loại tranh luận vô nghĩa;) Tôi đồng ý với che nói rằng nó có thể tiết kiệm một số chi tiết cụ thể hơn ... – neuro

0

Tôi không thể tưởng tượng sử dụng cho điều đó, nhưng, nó có lẽ là kết quả của thiết kế của malloc: nếu nó dễ dàng hơn để hỗ trợ nó hơn là không hỗ trợ, nó sẽ được hỗ trợ.

Cũng giống như nó okay để mất asin (4), và nó trả về một số phức tạp ... oops không nó không ...

+1

Bạn cần casin cho kết quả phức tạp. –

+0

Cái gì!? C không hỗ trợ một loại phức tạp ra khỏi hộp? Thật đáng tiếc :-) – neuro

+1

@neuro Bạn sẽ cười nhưng C không hỗ trợ phức tạp ra khỏi hộp. C99 yêu cầu trình biên dịch để thực hiện 'phức tạp' như một kiểu bản địa. –

2

Nó không phải là bắt buộc trong C (nhưng nó được ủy quyền cho mới trong C++). Có những trường hợp các đối tượng không có trạng thái (và vì vậy có kích thước null) nhưng danh tính của chúng là quan trọng. Trong trường hợp như vậy, có một trình cấp phát trả về các đối tượng hợp lệ và khác nhau cho một kích thước bằng 0 là cần thiết nếu bạn cần phân bổ chúng động.

+0

+1 cho nhận xét về trạng thái đối tượng. Một điều đáng tiếc như vậy phụ thuộc vào việc thực thi ... – neuro

+0

Như bạn đã nói, vì điều này phụ thuộc vào việc triển khai thực hiện, nó vô dụng. Nếu bạn muốn sử dụng phương pháp xấu xí như vậy để xác định các đối tượng có kích thước bằng 0 khác nhau, chỉ cần chuyển 'MIN (1, size)' vào 'malloc' và vỗ vào lưng bạn để lãng phí ít nhất 16 byte cho mỗi danh tính. –

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