Tôi sẽ không thực sự nghĩ về các chức năng string.h
là chức năng "bộ nhớ". Thay vào đó, tôi sẽ coi chúng là các hàm "mảng", vì chúng hoạt động trên dữ liệu nằm trong dãy bộ nhớ. Ngược lại, malloc
(và những người khác), thực sự cung cấp các dịch vụ bộ nhớ như phân bổ, thay vì thao tác dữ liệu trong một vùng bộ nhớ.
Cụ thể, các chức năng trong string.h
không quan tâm đến việc cấp phát hoặc phân bổ bộ nhớ hoặc bất kỳ hình thức quản lý bộ nhớ nào. Ngay cả một hàm như char * strerror(int)
, xuất hiện để tạo ra một chuỗi hoàn toàn mới, không thực hiện bất kỳ phân bổ nào, bởi vì giá trị trả về thực sự là một chuỗi được phân bổ tĩnh. Các hàm khác có thể trả về một con trỏ tới một khối bộ nhớ, nhưng đây thực sự chỉ là một trong các tham số của chúng (ví dụ: memcpy
). Hoặc họ trả về một con trỏ để bắt đầu một chuỗi con (strtok
), hoặc một số nguyên đại diện cho một so sánh (memcmp
).
Mặt khác, stdlib.h
cũng không thực sự là về bộ nhớ. Thiết kế của stdlib.h
là cung cấp các hoạt động có mục đích chung mà một số lượng lớn các chương trình có thể sẽ cần. Các chức năng bộ nhớ chỉ xảy ra là các ví dụ về các hoạt động cơ bản như vậy. Tuy nhiên, các chức năng khác như exit
và system
cũng là các ví dụ hay, nhưng không áp dụng cho bộ nhớ.
Bây giờ có một số chức năng trong stdlib.h
mà IMO có thể đã được đặt trong string.h
, đặc biệt là chức năng khác nhau chuyển đổi (mbstowcs
, wcstombs
, atoi
, strtod
, vv), và thậm chí có những bsearch
và qsort
chức năng. Các chức năng này tuân theo các nguyên tắc tương tự như các hàm string.h
(chúng hoạt động trên các mảng, không trả về các khối bộ nhớ mới được cấp phát, v.v.).
Nhưng từ góc độ thực tế, ngay cả khi nó làm cho rất nhiều ý nghĩa để kết hợp các mem*
chức năng với các chức năng malloc
, realloc
, calloc
và free
, các thư viện chuẩn C là bao giờ sẽ được tổ chức lại như thế này. Một thay đổi như vậy chắc chắn sẽ phá vỡ mã. Ngoài ra, stdlib.h
và string.h
đã tồn tại quá lâu và cả hai thư viện hữu ích và cơ bản như vậy, rằng những thay đổi có thể sẽ phá vỡ hầu hết (hoặc ít nhất, rất nhiều) mã C.
Điều này giống như vấn đề triển khai với thư viện C bạn đang sử dụng. Thư viện C khác có thể chọn chuyển memcpy sang stdlib. – AgA
'malloc' và gia đình đối phó với phân bổ bộ nhớ động. 'memcpy' và gia đình đối phó với chuỗi byte. 'strcpy' và gia đình cũng đối phó với chuỗi byte, theo một cách hơi khác. –
@AgA: Nếu thư viện C tuân theo tiêu chuẩn ISO thì 'memcpy' sẽ nằm trong' string.h', không phải 'stdlib.h'. – Blastfurnace