Vào đầu programm, tôi phân bổ bộ nhớ cho một mảng của char-con trỏ:Phân loại trong C: trao đổi con trỏ dẫn đến kết quả bất ngờ
char **buffer = calloc(20, sizeof(char *));
Sau đó, người dùng có thể nhập lên đến 20 chữ:
buffer[i] = calloc(40, sizeof(char));
fgets(buffer[i], 40, stdin)`
Sau đó tôi muốn sắp xếp mảng này. Nó hoạt động như mong đợi nếu tôi sử dụng chức năng trao đổi của tôi như sau:
void swap(char *args1, char *args2) {
char tmp[40];
strcpy(tmp, args1);
strcpy(args1, args2);
strcpy(args2, tmp);
}
void sort(char **args, int count) {
...
swap(args[i], args[j]);
...
}
Sau khi suy nghĩ qua chuyện này, tôi nhận thấy rằng đây là một sự lãng phí CPU vì tất cả tôi phải làm đã thực sự chuyển hướng các con trỏ đến chuỗi tương ứng. Vì vậy, tôi viết lại chức năng trao đổi của tôi:
void swap(char **args1, char **args2) {
char *tmp = *args1;
*args1 = *args2;
*args2 = tmp;
}
void sort(char **args, int count) {
...
swap(&args[i], &args[j]);
...
}
Tuy nhiên, điều này sẽ không làm việc ở tất cả, kết quả rất bất ngờ, tôi không thể hiểu tại sao (Tôi đã thử một số cuộc gọi printf và không có điều gì) ... hiểu biết của tôi là rằng các con trỏ chỉ là chuyển hướng và do đó hoán đổi, giả sử bộ nhớ trông như thế này:
(begin of char**):
100: *160
108: *200
116: *240
124: *280
...
(begin of char*):
160: Hello!\0
200: World!\0
...
ý tưởng của tôi là để thay đổi con trỏ thay vì các mảng cho nỗ lực CPU tối thiểu (đây: con trỏ swap trong 100 với con trỏ ở 108):
(begin of char**):
100: *200
108: *160
116: *240
124: *280
...
(begin of char*):
160: Hello!\0
200: World!\0
...
Tôi đã cố gắng giải thích điều này kỹ càng nhất có thể và tôi xin lỗi nếu có quá nhiều lời giải thích. Tôi sẽ vui mừng nhất nếu ai đó có thể cho tôi cái nhìn sâu sắc về điều này và giúp đỡ!
Mã đầy đủ (với strcpy làm việc) có thể được tìm thấy ở đây: http://pastie.org/5361481
Mã đầy đủ cho mã không hoạt động? –
Mã không hoạt động chỉ với phương thức hoán đổi thay thế và gọi: http://pastie.org/5361515 – Danyel
Thử bước qua mã, từng dòng một, với trình gỡ rối (cho một tập hợp đầu vào nhỏ). –