我有一个指向结构的指针数组。
我尝试使用这个问题的第一个答案来尝试解决这个问题,但是我遇到了段错误:
尝试这段代码后,我尝试使用这个函数进行洗牌:
static void shuffle(void *array, size_t n, size_t size) {
void * aux;
aux = malloc (size);
if (n > 1) {
size_t i;
for (i = 0; i < n - 1; ++i) {
size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
memcpy(aux, array[j], size);
memcpy(array[j], array[i], size);
memcpy(array[i], aux, size);
}
}
}
但是我得到了以下错误:
warning: dereferencing 'void *' pointer [enable by default]
error: invalid use of void expression
我收到此警告和错误 3 次:每个 memcpy() 一次。
编辑
我更改了代码,因为我试图使用这个新代码而不是旧代码。
最佳答案
你不能取消引用 void*
也不能在 C 中对其进行算术运算,因为它实际上是“指向未知类型对象的指针”,所以编译器不知道要做什么(一些编译器允许算术作为扩展,就好像它是 char*
,但不要依赖它)。
因此:
将您的 void*
转换为 char*
并用它们代替。不要忘记对指针算法进行自己的缩放。
另外,memcpy
应该得到一个指针,而不是指向的对象,所以使用 +
,而不是 []
。
旁白:请避免内存泄漏,释放
您分配的任何内存。
最后,请注意 random()
可能具有很小的范围和糟糕的统计属性。
最后+1:chux answer dissects the range-mapping used in this case ,显示它做得有多糟糕。
How to Debug Small Programs
C99 with Technical corrigenda TC1, TC2, and TC3 included
关于c - 在 C 中打乱泛型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23312276/