2009-11-24 35 views
30

Tôi đặc biệt tập trung vào việc khi nào sử dụng malloc trên con trỏ charKhi sử dụng malloc cho con trỏ char

char *ptr; 
ptr = "something"; 
...code... 
...code... 
ptr = "something else"; 

một malloc sẽ được để cho một cái gì đó như tầm thường như thế này? Nếu đúng thì tại sao? Nếu không, thì khi nào cần thiết cho con trỏ char?

Trả lời

30

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 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 */ 
+0

Điều gì sẽ sai với: char * foo = "bar"; char * bar = foo; printf ("% s \ n", thanh); – ZPS

+1

Đầ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

+0

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

9

malloc dùng để cấp phát bộ nhớ trên cửa hàng miễn phí. Nếu bạn có một chuỗi chữ mà bạn không muốn thay đổi những điều sau đây là ok:

char *literal = "foo"; 

Tuy nhiên, nếu bạn muốn để có thể sửa đổi nó, sử dụng nó như một bộ đệm để giữ một dòng đầu vào và do đó trên, sử dụng malloc:

char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */ 
// ... 
free(buf); 
4

sử dụng malloc() khi bạn không biết dung lượng bộ nhớ cần thiết trong thời gian biên dịch. Trong trường hợp nếu bạn có chuỗi chỉ đọc thì bạn có thể sử dụng const char* str = "something";. Lưu ý rằng chuỗi nhất có thể được lưu trữ ở một vị trí bộ nhớ chỉ đọc và bạn sẽ không thể sửa đổi nó. Mặt khác, nếu bạn biết chuỗi trong thời gian trình biên dịch thì bạn có thể làm một cái gì đó như: char str[10]; strcpy(str, "Something"); Ở đây bộ nhớ được cấp phát từ ngăn xếp và bạn sẽ có thể sửa đổi đường. Trường hợp thứ ba được phân bổ bằng cách sử dụng malloc. Cho phép nói rằng bạn không biết chiều dài của chuỗi trong thời gian biên dịch. Sau đó, bạn có thể làm char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);

1

Mỗi khi kích thước của chuỗi không xác định tại thời gian biên dịch, bạn phải cấp phát bộ nhớ với malloc (hoặc phương pháp tương đương). Trong trường hợp của bạn, bạn biết kích thước của chuỗi của bạn tại thời gian biên dịch (sizeof ("cái gì đó") và sizeof ("cái gì khác")).

2

malloc cho các ký tự đơn hoặc số nguyên và calloc cho mảng động. tức là pointer = ((int *)malloc(sizeof(int)) == NULL), bạn có thể làm phép tính trong ngoặc của malloc nhưng bạn không nên vì bạn nên sử dụng calloc trong đó có định nghĩa của void calloc(count, size) có nghĩa là có bao nhiêu mục bạn muốn lưu trữ tức là đếm và kích thước của dữ liệu tức là int, char, vv

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