在程序开始时,我为一个字符指针数组分配内存:
char **buffer = calloc( 20, sizeof(char *) );
然后用户最多可以输入 20 个单词:
buffer[i] = calloc( 40, sizeof(char) );
fgets( buffer[i], 40, stdin )`
之后我想对这个数组进行排序。如果我按如下方式使用我的交换功能,它会按预期工作:
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] );
...
}
经过思考后,我注意到这是对 CPU 的浪费,因为我所要做的实际上是将指针重定向到相应的字符串。所以我重写了我的交换函数:
void swap(char **args1, char **args2) {
char *tmp = *args1;
*args1 = *args2;
*args2 = tmp;
}
void sort( char **args, int count ) {
...
swap( &args[i], &args[j] );
...
}
但是,这根本行不通,结果非常出乎意料,我不知道为什么(我尝试了几次 printf 调用等等)......我的理解是指针只是被重定向并因此交换,假设内存看起来像这样:
(begin of char**):
100: *160
108: *200
116: *240
124: *280
...
(begin of char*):
160: Hello!\0
200: World!\0
...
我的想法是更改指针而不是数组以减少 CPU 工作量(这里:将 100 中的指针与 108 中的指针交换):
(begin of char**):
100: *200
108: *160
116: *240
124: *280
...
(begin of char*):
160: Hello!\0
200: World!\0
...
我试图尽可能彻底地解释这一点,如果解释太多,我很抱歉。如果有人能让我深入了解这一点并提供帮助,我将非常高兴!
完整的代码(带有工作的 strcpy)可以在这里找到:http: //pastie.org/5361481