Như đã chỉ ra bởi những người khác, bạn không cần phải sử dụng malloc chỉ để làm:
const char *foo = "bar";
Lý do cho điều đó là chính xác điều đó *foo
là một con trỏ — khi bạn khởi tạo foo
bạn không tạo bản sao của chuỗi, chỉ cần trỏ đến vị trí "bar"
trong phần dữ liệu của tệp thực thi của bạn. Bạn có thể sao chép con trỏ đó thường xuyên như bạn muốn, nhưng hãy nhớ, chúng luôn trỏ về cùng một thể hiện của chuỗi đó.
Vì vậy, khi nào bạn nên sử dụng malloc? Thông thường bạn sử dụng strdup()
để sao chép một chuỗi, xử lý malloc trong nền. ví dụ.
const char *foo = "bar";
char *bar = strdup(foo); /* now contains a new copy of "bar" */
printf("%s\n", bar); /* prints "bar" */
free(bar); /* frees memory created by strdup */
Bây giờ, cuối cùng chúng tôi nhận xung quanh để một trường hợp bạn có thể muốn malloc nếu bạn đang sử dụng sprintf()
hay, an toàn hơn snprintf()
mà tạo ra/định dạng một chuỗi mới.
char *foo = malloc(sizeof(char) * 1024); /* buffer for 1024 chars */
snprintf(foo, 1024, "%s - %s\n", "foo", "bar"); /* puts "foo - bar\n" in foo */
printf(foo); /* prints "foo - bar" */
free(foo); /* frees mem from malloc */
Điều gì sẽ sai với: char * foo = "bar"; char * bar = foo; printf ("% s \ n", thanh); – ZPS
Đầu tiên, nó phải là 'const char * foo ...', thứ hai, trong ví dụ của bạn chỉ sao chép con trỏ chứ không phải dữ liệu. 'strdup()' thực sự cũng sao chép dữ liệu. – scotchi
Một sửa đổi đã được đề xuất ở đây đúc kết quả của malloc đến '(char *)'. Điều đó là bắt buộc khi mã này được sử dụng trong C++, nhưng nói chung mã này * không nên * được sử dụng trong C++, vì vậy tôi đã hoàn nguyên chỉnh sửa. – scotchi