带有 void 数组指针参数的函数如何知道数组元素的大小?

How does a function with a void array pointer argument know the size of array elements?

K&R 的第 121 页列出了以下用于交换两个数组元素的函数:

void swap(void *v[], int i, int j)
{
    void *temp;

    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}

我不明白当数组没有类型时索引到数组是如何工作的。

据我所知,类型在运行时不存在,并且不能保证此函数会与使用它的代码一起编译。

当包含任意大小值的数组可以传递给该函数时,该函数如何正确执行数组索引?

换句话说,如果我向这个函数传递了一个 long 数组,当它不知道 v[i] 的类型时,它怎么知道 v[i] 位于 v + sizeof(long) * i数组?

数组 有类型。它是一个 void * 的数组,而 void * 是一个完全定义的类型,不像 void.

所以这个函数所做的是交换数组中的一对void *

如果 v 被定义为 void * 而不是 void *[],那么你就会遇到问题。