我找到了许多关于此问题的主题,但没有回应阐明我的具体问题。
所以K& R标题为“Pointers to function”的部分讨论了将任何指针的数组转换为void*
指针数组,然后将此数组传递给qsort
,以便成为能够对一般项目数组进行排序。
qsort
使用一个名为swap
的函数,该函数交换其中两个void*
指针,有效地交换数组中的位置指向的内容。
它通过常见的
实现了这一目标void* tmp = v[i];
v[i] = v[j];
v[j] = tmp;
这是我的问题。假设传入的v
是一个整数指针数组,假设它们是4个字节。在swap
中,此数组表示为void*
指针数组。当函数v[i] = ...
时,它将v
的第一个元素的位置偏移i*sizeof(void*)
,并获取此内存位置中的元素。正确?但是如果sizeof(void*)
与sizeof(int*)
不一样怎么办?然后v[i]
将无法获取包含原始int*
的整个内存位置,我甚至不敢假设将返回的内容。
那么swap
如何解释这一点呢?
提前致谢
答案 0 :(得分:0)
它将
v
的第一个元素的位置偏移i*sizeof(void*)
并获取此内存位置中的元素。正确的吗?
是的,它根据通常的指针算法使用元素的大小来获取索引元素的位置,在本例中为void*
。
但如果
sizeof(void*)
与sizeof(int*)
不同,该怎么办?然后v[i]
将无法获取包含原始int*
的整个内存位置,我甚至不敢假设将返回的内容。
事实上,sizeof(void*)
不一定要与sizeof(int*)
相同(虽然经常是这样),如果尺寸不一样,迟早你可能会结束未定义的行为。
那么交换如何解释呢?
它没有。然而,stdlib的qsort是不同的:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
size
参数通过指定每个元素的大小来处理此问题,允许对非指针类型进行排序,并将可以正确转换回原始类型的void指针传递给{{1}功能。
您可以自己编写一个类似的compar()
,将元素的大小作为参数接受,计算正确的位置,然后使用swap()
进行交换。