[英]How qsort modify pointer to string?
glibc中qsort
的實現通過交換函數修改指針數組,如下所示:
#define SWAP(a, b, size) \
do \
{ \
register size_t __size = (size); \
register char *__a = (a), *__b = (b); \
do \
{ \
char __tmp = *__a; \
*__a++ = *__b; \
*__b++ = __tmp; \
} while (--__size > 0); \
} while (0)
...在這里查看完整代碼...
說,我已經這樣聲明了指針數組:(我知道不能修改指針字符串)。
char *a[] = {"one", "two", "three", "four"},
*lo = (char*)a,
*hi = &lo[2];
SWAP(lo, hi, 4); // Doesn't work.
簡而言之,我想知道qsort
如何對字符串指針數組進行排序。 據我所知,指針數組無法修改。 它只能指向其他指針。
您對lo
和hi
初始化不正確。 他們應該是:
char *lo = (char*)&a[0],
*hi = (char*)&a[2];
這將交換lo
和hi
的值。 完整代碼:
#include <stdio.h>
#define SWAP(a, b, size) \
do \
{ \
register size_t __size = (size); \
register char *__a = (a), *__b = (b); \
do \
{ \
char __tmp = *__a; \
*__a++ = *__b; \
*__b++ = __tmp; \
} while (--__size > 0); \
} while (0)
int main(int argc, char *argv[]) {
char *a[] = {"one", "two", "three", "four"};
char *lo = (char*)&a[0], *hi = (char*)&a[2];
SWAP(lo, hi, sizeof(*lo));
int i;
for (i = 0; i < 4; i++) {
printf("a[%d] = %s\n", i, a[i]);
}
}
輸出:
a[0] = three
a[1] = two
a[2] = one
a[3] = four
假設字符串存儲器最初是這樣的,從地址1000開始:
one\0two\0three\0four\0
數組的值為:
a[0] = 1000 -> one
a[1] = 1004 -> two
a[2] = 1008 -> three
a[3] = 1014 -> four
在SWAP
,字符串存儲器保持不變,但數組現在為:
a[0] = 1008 -> three
a[1] = 1004 -> two
a[2] = 1000 -> one
a[3] = 1014 -> four
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.